Open XML Insert в таблице Temp - SQL 2005 - PullRequest
0 голосов
/ 27 августа 2009

У меня есть хранимая процедура, в которой я передаю простой XML:

'<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>'

У меня есть таблица @temp в SQL, в которой есть столбец ProductId:

DECLARE @Temp TABLE (
ProductId NVARCHAR(10)
)     

Мне нужно написать оператор вставки, который будет циклически перебирать ProductId в XML (который может быть бесконечным) и продолжать вставку (в таблицу @temp), пока в XML не останется больше узлов ProductId.

Решение с использованием курсоров невозможно!

Ниже приведен код, который я пытаюсь выполнить:

Declare @test XML
SET @test = '<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>'
DECLARE @Temp TABLE(        
    ProductId NVARCHAR(10)
   )  
INSERT INTO @Temp(ProductId)
SELECT tab.col.value('./ProductId[1]','NVARCHAR(10)') AS 'ProductId'
FROM @test
CROSS APPLY
xml_data.nodes('//Products') AS tab(col)

Я получаю сообщение об ошибке:

Must declare the table variable "@test".

Ответы [ 3 ]

2 голосов
/ 27 августа 2009
DECLARE @test XML
    SET @test = '<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>'

DECLARE @Temp TABLE(ProductId NVARCHAR(10))  

DECLARE @docHandle int 
EXEC sp_xml_preparedocument @docHandle OUTPUT, @doc 

INSERT INTO @Temp(ProductId)
     SELECT t.value('./ProductId[1]','NVARCHAR(10)') AS 'ProductId'
       FROM OPENXML(@docHandle, '//Products', 1) t

EXEC sp_xml_removedocument @docHandle 
2 голосов
/ 11 февраля 2014
DECLARE @idoc int

DECLARE @doc varchar(1000)

SET @doc ='
<OutLookContact>
<Contact FirstName="Asif" LastName="Ghafoor" EmailAddress1="asifghafoor@my.web.pk" />
<Contact FirstName="Rameez" LastName="Ali" EmailAddress1="rameezali@my.web.pk" />
<Contact FirstName="Aneel" LastName="Maqsood" EmailAddress1="aneelmaqsood@my.web.pk" />
</OutLookContact>'

--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 @Temp TABLE(FirstName VARCHAR(250),LastName VARCHAR(250),Email1 VARCHAR(250))  

INSERT INTO @Temp(FirstName,LastName,Email1)



SELECT *

FROM OPENXML (@idoc, '/OutLookContact/Contact',1)

WITH (FirstName varchar(50),LastName varchar(50),EmailAddress1 varchar(50))


select FirstName,LastName,Email1 from @Temp
0 голосов
/ 27 августа 2009

Вы можете поместить xml в другую временную таблицу, а затем выполнить оператор вставки:

http://www.lockergnome.com/sqlsquirrel/2008/05/23/how-to-turn-imported-xml-into-a-relational-format-in-sql-server-2005/

...