【问题标题】:TSQL multiple values in where clause using XML nodes使用 XML 节点的 where 子句中的 TSQL 多个值
【发布时间】:2016-05-09 01:44:19
【问题描述】:

我有下面的代码。我之前使用过与此非常相似的东西来允许在逗号分隔的字符串中输入多个值。

由于某种原因,尽管查询只获取第一个值并且不会继续读取值。 @Tables 会类似于 "Table1, table2, table3" 有人能看出我的错误吗?如果我在数据库上执行'1, 2, 3, 4',它适用于数字,但它不适用于字符串。

DECLARE @TableXML AS XML
SET @TableXML = cast(('<a>'+replace(@Tables,',' ,'</a><a>')
             +'</a>') AS XML);

SELECT
*   
FROM CABDetail 
WHERE CABDetail.BudgetName in (SELECT
    a.value('.', 'varchar(max)')
    FROM @TableXML.nodes('a') AS FN(a)
)

ORDER BY CABDetail.account

【问题讨论】:

  • 假设 CABDetail.BudgetName 包含值 Table1、table2、table3 之一应该可以工作。您能否使用可用于重现问题的数据创建示例表?

标签: sql sql-server xml tsql nodes


【解决方案1】:

你可以TRIM 结果:Table1, table2, table3

SELECT *   
FROM CABDetail 
WHERE CABDetail.BudgetName in (SELECT LTRIM(RTRIM(a.value('.', 'varchar(max)')))
                               FROM @TableXML.nodes('a') AS FN(a)
)
ORDER BY CABDetail.account;

LiveDemo

原因很简单,解析后会得到:

'Table1'
' table2'
' table3'

当比较 'table2'' table2' 不同时。

它适用于数字,因为您可以将 CAST ' 2' 隐式转换为整数。

SELECT CAST(' 2' AS INT);
-- 2

', '代替','的另一种可能性:

DECLARE @TableXML AS XML
SET @TableXML = cast(('<a>'+replace(@Tables,', ' ,'</a><a>')
      +'</a>') AS XML);

SQL Server 2016+你可以使用内置的STRING_SPLIT函数:

SELECT *
FROM #CABDetail
WHERE BudgetName in (SELECT RTRIM(LTRIM([value]))
                     FROM STRING_SPLIT(@Tables, ','));

LiveDemo2

【讨论】:

    【解决方案2】:

    您的 SQL 脚本似乎在我的 SQL2014 db 上成功运行

    declare @Tables as nvarchar(max) = 'Table1, table2, table3'
    
    DECLARE @TableXML AS XML
    SET @TableXML = cast(('<a>'+replace(@Tables,',' ,'</a><a>')+'</a>') AS XML);
    
    SELECT
    a.value('.', 'varchar(max)')
    FROM @TableXML.nodes('a') AS FN(a)
    

    似乎没有什么问题 但是你可以考虑使用SQL split string function 并在 Select 语句中使用它作为替代方案,如果你不能确定你的案例中的问题

    declare @Tables as nvarchar(max) = 'Table1, table2, table3'
    SELECT val FROM dbo.Split(@Tables, ',') a
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多