2011-08-08 1 views
1

Supposons que j'ai une question comme ça -TSQL - variables d'utilisation dans OPENXML

SELECT * FROM 
    OPENXML(@i, '/root/authors', 2) 
     WITH authors 

Maintenant, je veux passer '/root' via un paramètre variable/comme -

DECLARE @nodeName varchar(MAX) ----> EDIT: Solution- Use fixed length instead of MAX 
SET @nodeName = '/root' 

et utiliser @nodeName au lieu . Puis concaténer le reste des éléments de manière dynamique. J'obtiens une erreur simplement en utilisant @nodeName dans le paramètre OPENXML.

+0

Peut-on voir le code réel et le message d'erreur? – mgnoonan

+0

C'est l'exemple de code de msdn utilisant la base de données PUBS. OPENXML (@i, @nodeName, 2) –

+0

Quel est le message d'erreur exact que vous obtenez? – Jason

Répondre

1

J'ai essayé ce qui suit dans SQL 2008 R2 et cela fonctionne très bien.

DECLARE @idoc int 
DECLARE @doc varchar(1000) 
SET @doc =' 
<ROOT> 
<Customer CustomerID="VINET" ContactName="Paul Henriot"> 
    <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00"> 
     <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/> 
     <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/> 
    </Order> 
</Customer> 
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez"> 
    <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00"> 
     <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/> 
    </Order> 
</Customer> 
</ROOT>' 
--Create an internal representation of the XML document. 
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc 
-- Execute a SELECT statement that uses the OPENXML rowset provider. 
DECLARE @NodeName VARCHAR(100) 
SET @NodeName = '/ROOT/Customer' 
SELECT * 
FROM  OPENXML (@idoc, @NodeName,1) 
      WITH (CustomerID varchar(10), 
        ContactName varchar(20)) 

Il se pourrait que d'autres versions de SQL prennent en charge que l'utilisation de NVARCHAR comme paramètre, et non VARCHAR.

J'espère que cette aide.

+0

J'ai eu le problème. Dans la partie DECLARE @NodeName, je ne peux pas utiliser MAX. Je devrais passer une longueur fixe comme varchar (50). Alors ça marche! –

+0

J'ai édité avec la solution. Passons maintenant à la deuxième partie de la question. Comment concaténer dynamiquement? –

2

Mieux vaut utiliser le nouveau type XML.

create proc [dbo].[getLocationTypes](@locationIds XML, 
@typeIds XML=null) 
as 
begin 
set nocount on 


SELECT locationId, typeId 
FROM xrefLocationTypes 
WHERE locationId 
IN (SELECT Item.value('.', 'int') 
FROM @locationIDs.nodes('IDList/ID') AS x(Item)) 
AND (typeId IN 
(SELECT Item.value('.', 'int') 
FROM @typeIds.nodes('IDList/ID') AS x(Item))) 
ORDER BY 1, 2 

end 

Et vous appelez cela comme:

EXECUTE dbo.getLocationTypes '<IDList><ID>1</ID><ID>3</ID></IDList>', 
'<IDList><ID>200</ID><ID>300</ID><ID>400</ID></IDList>'