将变量传递给`.exist()`方法?

时间:2014-06-11 17:47:52

标签: sql sql-server xml

有没有办法将变量传递给.exist()方法?以下是我在SQL Server Manager 2012上运行的原始代码:

CREATE TABLE #ExtractXML(xmldata xml)
    insert into #ExtractXML (xmldata)
    SELECT           
            CASE WHEN FormResults.XMLFormFields.exist('(/form/PalletItems/Items)[1]') = 0 then NULL 
            ELSE      FormResults.XMLFormFields.query('(/form/PalletItems/Items)[1]') END       
    FROM FormResults
    where FormTypeID = @FormTypeID

我想存储这个:'(/form/PalletItems/Items)[1]'和变量@XMLPath varchar(100)。我想我可以简单地插入它:

SELECT           
            CASE WHEN FormResults.XMLFormFields.exist(@XMLPath) = 0 then NULL
            ELSE      FormResults.XMLFormFields.query(@XMLPath) END     
    FROM FormResults where FormTypeID = 1

但我收到错误消息:The argument 1 of the XML data type method "exist" must be a string literal.

你们有什么建议吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

SQL Server XQuery Extension Functions

DECLARE @x xml = '<A>foo</A>'

DECLARE @Xpath varchar(max) = '/A'
SELECT @x.exist('sql:variable("@Xpath")')

DECLARE @Xpaths TABLE (Xpath varchar(max))
INSERT @Xpaths VALUES ('/A')
SELECT @x.exist('sql:column("Xpath")') FROM @Xpaths

答案 1 :(得分:1)

我能够在Mikael Eriksson的这篇文章中找到这个问题的答案: https://stackoverflow.com/a/9240960/3281388

它类似于Anon所说的,但它添加了本地名称()。这是我的新代码和改进代码:

CREATE TABLE #ExtractXML(xmldata xml)
    insert into #ExtractXML (xmldata)
    SELECT      
    CASE WHEN FormResults.XMLFormFields.exist('(//*[local-name() = sql:variable("@parent")])[1]') = 0 then NULL 
    ELSE      FormResults.XMLFormFields.query('(//*[local-name() = sql:variable("@parent")])[1]') END       
    FROM FormResults

感谢大家的帮助!