2017-10-11 94 views
0

我有一张表,其中由于某些原因行是XML格式。在SQL Server中使用OpenXML

我必须解析这些行,并从XML本身创建一个新表。

我阅读并发现在那里有OpenXML在SQL Server中。我正在使用SQL Server 2016 SP1版本。

我按照有关如何从上面的链接使用XML,但说明:成功完成

DECLARE @idoc int, @doc varchar(1000); 

指令(S)。

下一个命令:

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>'; 

为此,我得到:

消息137,级别15,状态1,行1870
必须声明标量变量 “@doc”。

这是奇怪的,因为我只是在上面的命令中声明它成功。

现在:

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc; 

消息137,级别15,状态2,1887年行
必须声明标量变量 “@idoc”。

任何方式可以解决这个错误?

+0

你应该运行所有线路同时 –

+0

@sarslan但在代码中,行会得到一个正确执行的一个......假设我把所有这在一个函数或存储过程中......然后......如果我想把所有这些都当作一个过程,你能帮助一下吗? –

+0

@RajeshRonaldo,正确的行将按照逻辑顺序运行,但整个脚本需要首先编译,你声明的是一个局部变量,它具有当前批处理的生命期,一个完成它将被“删除”。 – dbajtr

回答

0

您是否单独运行每个零件?

运行整个事情作为一个脚本:

DECLARE @idoc int, @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>'; 
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc; 
GO 
+0

thx,还有一件事是如何将这一切作为一个过程......以便我可以通过传递xml本身来调用它一次? –

+0

你会传递你当前设置为“@ doc”的xml吗?如果是,那么类似这样:CREATE PROCEDURE testproc @input XML AS DECLARE @doc VARCHAR(1000); EXEC sp_xml_preparedocument @input OUTPUT,@ doc; GO' – dbajtr