2017-10-11 91 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