2011-08-08 5 views
1

TSQL - OPENXML에서 변수 사용

SELECT * FROM 
    OPENXML(@i, '/root/authors', 2) 
     WITH authors 
이제 매개 변수/변수 (예 :

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

)를 통해 '/root'을 전달하고 대신 @nodeName을 사용하고 싶습니다. 그런 다음 나머지 요소를 동적으로 연결합니다. 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

새로운 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>'