Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在临时表中打开XML插入-SQL 2005_Sql_Sql Server_Xml_Insert - Fatal编程技术网

在临时表中打开XML插入-SQL 2005

在临时表中打开XML插入-SQL 2005,sql,sql-server,xml,insert,Sql,Sql Server,Xml,Insert,我有一个存储过程,其中传递一个简单的XML: '<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>' 我需要编写一个insert语句,它将循环遍历XML中的ProductId(可以是无限的),并继续插入@temp表中,直到XML不再有ProductId节点为止 涉及游标的解决方案不可行 以下是我尝试执行的代码: Declare @tes

我有一个存储过程,其中传递一个简单的XML:

'<Products><ProductId>1</ProductId><ProductId>2</ProductId></Products>'
我需要编写一个insert语句,它将循环遍历XML中的ProductId(可以是无限的),并继续插入@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)

您可以将xml放入另一个临时表中,然后从那里执行insert语句:


您可以将xml放入另一个临时表中,然后从那里执行insert语句:


刚刚添加了一个独立的代码来解释我的示例仍然会抛出一个错误!刚刚添加了一个独立的代码来解释我的示例仍然会抛出一个错误!试着只运行INSERT的SELECT部分,用xml字符串替换掉@test。确保works First不允许我在字符串上执行FROM。是的,需要使用OPENXML-请参阅我的更新答案。Ref:OPENXML:尝试只运行INSERT的SELECT部分,用xml字符串替换@test。确保works First不允许我在字符串上执行FROM。是的,需要使用OPENXML-请参阅我的更新答案。参考:OPENXML:
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".
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 
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