有没有办法将变量传递给.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.
你们有什么建议吗?非常感谢!
答案 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
感谢大家的帮助!