2011-08-08 18 views
1

で変数を使用する -TSQL - 私はこのようなクエリがあるとしOPENXML

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

、代わりに@nodeName使用 -

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

を、私は次のようにパラメータ/変数を経由して'/root'を渡したいです。次に、残りの要素を動的に連結します。 OPENXMLパラメータで@nodeNameを使用するだけでエラーが発生します。

+0

は、我々は実際のコードとエラーメッセージを見ることができますか? – mgnoonan

+0

これは、PUBS DBを使用するmsdnのコードサンプルです。 OPENXML(@i、@ nodeName、2) –

+0

正確なエラーメッセージは何ですか? – Jason

答えて

1

SQL 2008 R2で次のように試してみましたが、正常に動作します。

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)) 

他のバージョンのSQLでは、VARCHARではなくパラメータとしてNVARCHARを使用できます。

このヘルプが欲しいです。

+0

私は問題があります。 DECLARE @NodeNameの部分ではMAXを使用できません。私はvarchar(50)のような固定長を渡す必要があります。その後、それは動作します! –

+0

私は解決策を使って編集しました。今質問の第2部に行く。どのように動的に連結するのですか? –

2

新しい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 

そして、あなたがこのように呼び出します。

EXECUTE dbo.getLocationTypes '<IDList><ID>1</ID><ID>3</ID></IDList>', 
'<IDList><ID>200</ID><ID>300</ID><ID>400</ID></IDList>'  
関連する問題