Синтаксическая ошибка при использовании sql: variable в XML-узлах запроса SQL Server - PullRequest
0 голосов
/ 21 мая 2019

Я работал над запросом для извлечения данных XML из базы данных SQL Server. Я хочу извлечь конкретную строку из XML. Если я жестко закодировал идентификатор в строке .nodes, он работает как задумано, но я не могу избежать синтаксической ошибки при замене жестко закодированного значения на sql: variable и исчерпал свой Google-foo

'''SQL
DECLARE @XML XML = '<DynamicModel>
<AvailableElements>
  <Control Id="97a0d1c6-f2b4-4f6f-8d01-f6110f1679af">
  <Property Name="Name" Value="Picklist1" />
  <Property Name="Id" Value="97a0d1c6-f2b4-4f6f-8d01-f6110f1679af" />
  <Property Name="Label" Value="Label value here" />
  <Property Name="SelectedItemId" Value="Value in here" Type="System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" IsRequired="True" IsReference="True" />
  <Elements />
  <AvailableElements />
</Control>
</AvailableElements>
</DynamicModel>'
DECLARE @ElementID NVARCHAR(100) = '97a0d1c6-f2b4-4f6f-8d01-f6110f1679af'

/* WORKS */
SELECT
codedValue.value('@Name[1]', 'nvarchar(500)') AS ItemName,
codedValue.value('@Value[1]', 'nvarchar(500)') AS ItemValue
FROM @XML.nodes('/DynamicModel/AvailableElements/Control[@Id="97a0d1c6-f2b4-4f6f-8d01-f6110f1679af"]/Property') AS x(codedValue)
WHERE codedValue.value('@Name[1]', 'nvarchar(500)') IN ('Text','Date','SelectedItemId','Label')

/* DOES NOT WORK */
SELECT
codedValue.value('@Name[1]', 'nvarchar(500)') AS ItemName,
codedValue.value('@Value[1]', 'nvarchar(500)') AS ItemValue
FROM    @XML.nodes('/DynamicModel/AvailableElements/Control[@Id="sql:variable("@ElementID")]/Property') AS x(codedValue)
WHERE codedValue.value('@Name[1]', 'nvarchar(500)') IN ('Text','Date','SelectedItemId','Label')
'''

Версия в жестком коде вернула две строки, что правильно на основе XML. Версия, использующая sql: variable с ошибкой в ​​сообщении 'XQuery [узлы ()]: синтаксическая ошибка рядом с' @ ', ожидается'] '.'

1 Ответ

0 голосов
/ 21 мая 2019

Ваш запрос должен быть таким -

SELECT
codedValue.value('@Name[1]', 'nvarchar(500)') AS ItemName,
codedValue.value('@Value[1]', 'nvarchar(500)') AS ItemValue
FROM    @XML.nodes('/DynamicModel/AvailableElements/Control[@Id=sql:variable("@ElementID")]/Property') AS x(codedValue)
WHERE codedValue.value('@Name[1]', 'nvarchar(500)') IN ('Text','Date','SelectedItemId','Label')
...