2012-06-14 54 views
9

字符串如何改變我的查詢,以便該錯誤不會發生:XML數據類型的方法「值」必須是文字

XML數據類型的方法「值」必須是一個字符串字面

T-SQL代碼:

Declare @Count Int = 1 
While(@count <= @j) 
Begin 
insert into mytable 
([Word]) 
Select ([XmlColumn].value(N'word['+Cast(@Count as nvarchar(2))+']/@Entry','nvarchar(max)')) 
    from OtherTable WHERE ID=2 

回答

13

不能連接變量作爲字符串這樣的值的方法。您需要使用sql:variable("@VariableName")

所以,你的例子是這樣的:

Declare @Count Int = 1 
While(@count <= @j) 
Begin 
insert into mytable 
([Word]) 

Select ([XmlColumn].value(N'/word[sql:variable("@Count")]/@Entry)[1]','nvarchar(max)')) 
    from OtherTable WHERE ID=2 
+0

不要使用變量名引號:SQL:變量( 「@ VARIABLENAME」) - > SQL:變量(@VariableName) – HuRN

1

認爲我會尋找一種方法來此是不需要WHILE循環。主要的問題是返回與節點沿項目的位置,但我發現了一個解決辦法在這個帖子上的最後一個答案:http://social.msdn.microsoft.com/Forums/nl/sqlxml/thread/46a7a90d-ebd6-47a9-ac56-c20b72925fb3

因此,另一種方法是:

insert into mytable ([Word]) 
select word from (
    Select 
     words.value('@entry','nvarchar(max)') as word, 
     words.value('1+count(for $a in . return $a/../*[. << $a])', 'int') as Pos 
    from 
     OtherTable ot 
     cross apply ot.XMLColumn.nodes('words/word') x(words) 
) sub where Pos <= @j 

基本上內部查詢返回每個單詞和它的位置,這可以由外部查詢過濾。

僅供參考我的​​表的定義是:

create table OtherTable (XMLColumn xml) 
insert OtherTable (XMLColumn) 
select '<words><word entry="Wibble"/><word entry="Hello"/><word entry="World"/></words>' 
相關問題