2012-06-14 38 views
9

Làm thế nào để thay đổi truy vấn của tôi để lỗi này không xảy ra: kiểu dữ liệu phương pháp “giá trị”XML phải là một chuỗi literal

XML phải là một chuỗi literal

mã 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 

Trả lời

13

Bạn không thể nối biến như dây đàn theo cách này đối với phương pháp giá trị. Bạn cần sử dụng sql:variable("@VariableName").

Vì vậy, ví dụ của bạn sẽ là một cái gì đó như thế này:

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

Không sử dụng dấu ngoặc kép vào tên biến: sql: biến ("@ VariableName") -> sql: biến (@VariableName) – HuRN

1

nghĩ rằng tôi muốn tìm kiếm một cách tiếp cận này mà không yêu cầu các WHILE vòng lặp. Vấn đề chính là trở về một vị trí mục cùng với các nút, nhưng tôi tìm thấy một workaround trong câu trả lời cuối cùng về bài đăng này: http://social.msdn.microsoft.com/Forums/nl/sqlxml/thread/46a7a90d-ebd6-47a9-ac56-c20b72925fb3

Vì vậy, các phương pháp thay thế sẽ là:

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 

Về cơ bản các truy vấn trả về nội mỗi từ và vị trí của nó, điều này có thể được lọc bởi truy vấn bên ngoài.

Để tham khảo định nghĩa của tôi về bảng OtherWords là:

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