2014-03-18 23 views
0

這是一個獨特的問題..我想。所以我的目標是輸入一個變量並從我的列中獲取一行。讓我來解釋一下代碼即將做的事情。在SQL中使用xml來評估動態變量

SELECT 
    pref.query('Database/text()') as PersonSkills, 
    pref.query('FillQuery/text()') as PersonSkills, 
    pref.query('TabText/text()') as PersonSkills, 
    pref.query('TooltipText/text()') as PersonSkills 
    FROM table CROSS APPLY 
    Tag.nodes('/Root/Configuration/TaskSelectorControl/QueueSelector') AS People(pref) 

這工作正常。然而,我需要做的是在最後一部分傳遞隊列選擇器作爲變量。

DECLARE @Xml XML 
DECLARE @AttributeName VARCHAR(MAX) = 'QueueSelector' 
SELECT 
pref.query('Database/text()') as PersonSkills, 
    pref.query('FillQuery/text()') as PersonSkills, 
    pref.query('TabText/text()') as PersonSkills, 
    pref.query('TooltipText/text()') as PersonSkills 
    FROM table CROSS APPLY 
Tag.nodes('/Root/Configuration/TaskSelectorControl[@Name=sql:variable("@AttributeName")] 
') AS People(pref) 

這不行,任何想法爲什麼?

嗯,我有點撒謊。底部的作品,但它返回一個空的數據集

回答

1
/Root/Configuration/TaskSelectorControl/QueueSelector 

不等同於:

/Root/Configuration/TaskSelectorControl[@Name='QueueSelector'] 

以上的XPath選擇<TaskSelectorControl Name="QueueSelector">,不<QueueSelector>兒童<TaskSelectorControl>

你可以做這一點在XPath中:

/Root/Configuration/TaskSelectorControl/*[local-name(.)=sql:variable("@AttributeName")] 

或者它可能是簡單的Concat的評估之前:

'/Root/Configuration/TaskSelectorControl/' + @AttributeName 
+1

你,先生,是驚人的 – DidIReallyWriteThat