2010-01-11 6 views
0

Je stocke des valeurs XML dans une entrée de ma base de données. À l'origine, j'extrais le type de données xml dans ma logique métier puis remplissais les données XML dans un DataSet. Je veux améliorer ce processus en chargeant le code XML directement dans le T-SQL. Au lieu d'obtenir le XML en tant que chaîne puis en le convertissant sur le BL.Meilleure approche, Dynamic OpenXML dans T-SQL

Mon problème est le suivant: chaque entrée xml est dynamique, ce qui signifie qu'elle peut être n'importe quelle colonne créée par l'utilisateur. J'ai essayé d'utiliser cette approche, mais il me donne une erreur:

CREATE PROCEDURE spXMLtoDataSet 
    @id uniqueidentifier, 
    @columns varchar(max) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @name varchar(300); 
    DECLARE @i int; 
    DECLARE @xmlData xml; 
    (SELECT @xmlData = data, @name = name FROM XmlTABLES WHERE (tableID = ISNULL(@id, tableID))); 

    EXEC sp_xml_preparedocument @i OUTPUT, @xmlData 

    DECLARE @tag varchar(1000); 
    SET @tag = '/NewDataSet/' + @name; 
    DECLARE @statement varchar(max) 
    SET @statement = 'SELECT * FROM OpenXML(@i, @tag, 2) WITH (' + @columns + ')'; 
    EXEC (@statement); 

    EXEC sp_xml_removedocument @i 
END 

où je passe un @ écrit dynamiquement.

Par exemple:

spXMLtoDataSet 'bda32dd7-0439-4f97-bc96-50cdacbb1518', 'ID int, TypeOfAccident int, Major bit, Number_of_Persons int, Notes varchar(max)' 

mais ont continué à me lancer cette exception:

Msg 137, Level 15, State 2, Line 1 
Must declare the scalar variable "@i". 
Msg 319, Level 15, State 1, Line 1 
Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon. 

Répondre

0

Vos appels à sp_xml_% (deux d'entre eux) devrait également être dynamique de sorte que le handle @i est reconnu

Sûrement, c'est le meilleur dans votre code client?

Hors sujet: et un PK GUID aussi?

1

remplacer votre @statement avec ce

SET @statement = 'DECLARE @i int; 
DECLARE @xmlData xml; 
(SELECT @xmlData = data, @name = name FROM XmlTABLES WHERE (tableID = ISNULL(@id, tableID))); 
EXEC sp_xml_preparedocument @i OUTPUT, @xmlData 
SELECT * FROM OpenXML(@i, @tag, 2) WITH (' + @columns + ')'; 
EXEC (@statement); 
Questions connexes