【问题标题】:Open XML Insert in Temp table - SQL 2005在临时表中打开 XML 插入 - SQL 2005
【发布时间】:2009-08-27 18:25:58
【问题描述】:

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

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

我在 SQL 中有一个 @temp 表,它有一个 ProductId 列:

DECLARE @Temp TABLE (
ProductId NVARCHAR(10)
)     

我需要编写一个插入语句,它将遍历 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)

我不断收到错误:

Must declare the table variable "@test".

【问题讨论】:

标签: sql sql-server xml insert


【解决方案1】:
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】:
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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2011-02-05
      • 2011-08-21
      相关资源
      最近更新 更多