簡體   English   中英

在XML節點SQL Server查詢中使用sql:variable的語法錯誤

[英]Syntax error using sql:variable in an XML nodes SQL Server query

我一直在研究從SQL Server數據庫中提取XML數據的查詢。 我想從XML中提取一個特定的行。 如果我在.nodes行中對ID進行硬編碼,它會按預期工作,但是當用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:變量的版本錯誤消息'XQuery [nodes()]:'@'附近的語法錯誤,期望']'。'

您的查詢應該像這樣 -

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM