【问题标题】:The argument 1 of the XML data type method "query" must be a string literalXML 数据类型方法“query”的参数 1 必须是字符串文字
【发布时间】:2017-07-31 15:49:24
【问题描述】:

我在 SQL Server 中有 xml 格式的数据。现在我试图根据我的查询找出单个记录。我把我的代码放在下面,

declare @xml xml
declare @ID varchar
set @ID = '1'
set @xml = '
<row>
    <Id>1</Id>
    <name>OM</name>
</row>
<row>
    <Id>2</Id>
    <name>JAI</name>
</row>
<row>
    <Id>2</Id>
    <name>JAGDISH</name>
</row>
'

当我执行查询时,它会给我一个正确的结果(xml 节点):

Select @xml.query('/row[Id="1"]');

但是当我连接@ID 进行查询时,它给了我一个错误:

Select @xml.query('/row[Id='+ @ID +']');

错误是:

XML 数据类型方法“query”的参数 1 必须是字符串文字。

【问题讨论】:

    标签: sql-server sql-server-2008 tsql


    【解决方案1】:

    您将需要sql:variable() XQuery 扩展函数来引用变量。这个函数(来自链接的引用)“在 XQuery 表达式中公开了一个包含 SQL 关系值的变量”。

    Select @xml.query('/row[Id=sql:variable("@ID")]');
    

    【讨论】:

      【解决方案2】:

      您可以使用动态 SQL:

      IF TRY_PARSE(@ID AS INT) IS NULL
         THROW 50000, 'ID is not integer',1;
      
      
      DECLARE @sql NVARCHAR(MAX) = 'Select @xml.query(''/row[Id=<placeholder>]'')';
      
      SET @sql = REPLACE(@sql, '<placeholder>', @Id);
      
      EXEC sp_executesql @sql, N'@xml XML', @xml;
      

      Rextester Demo

      警告!

      请注意,您应该始终检查用户输入。

      【讨论】:

        猜你喜欢
        • 2020-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-07
        • 2018-11-18
        • 2022-08-21
        • 2023-02-14
        • 2021-06-02
        相关资源
        最近更新 更多