a

Câu hỏi Phương thức "giá trị" kiểu dữ liệu XML phải là một chuỗi ký tự [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

Cách thay đổi truy vấn của tôi để lỗi này không xảy ra:

Phương thức "giá trị" kiểu dữ liệu XML phải là một chuỗi ký tự

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

9
2018-06-14 08:49


gốc




Các câu trả lời:


Bạn không thể nối các biến dưới dạng chuỗi theo cách này cho phương thức 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

13
2018-06-14 09:16



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


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

Vì vậy, cách tiếp cận 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, truy vấn bên trong trả về 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ề OtherWords bảng là:

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

1
2018-06-14 09:32