2012-06-14 22 views
9

Jak zmienić zapytanie tak, że ten błąd się nie dzieje:XML typ danych metodą „wartość” musi być ciągiem dosłowne

XML typ danych metodą „wartość” musi być ciąg dosłownego

kod 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 

Odpowiedz

13

nie można złączyć zmienne jak ciągi w ten sposób do metody wartości. Musisz użyć sql:variable("@VariableName").

Więc Przykładem może być coś takiego:

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

Nie używaj cytatów na temat nazwy zmiennej: SQL: zmienna ("@ variableName") -> sql: variable (@VariableName) – HuRN

1

myślałem, że spojrzeć na podejście do tego, że nie wymaga WHILE pętli. Głównym problemem jest powrót położenia elementu wraz z węzłem, ale znalazłem obejście w ostatniej odpowiedzi w tym poście: http://social.msdn.microsoft.com/Forums/nl/sqlxml/thread/46a7a90d-ebd6-47a9-ac56-c20b72925fb3

Więc Alternatywnym rozwiązaniem byłoby:

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 

zasadzie wewnętrzne zyski zapytania każde słowo i jego położenie, może być filtrowane przez zapytanie zewnętrzne.

Dla porównania moja definicja tabeli OtherWords było:

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