【问题标题】:T-SQL: How to do this: select * from xy where uid in (@parameter)T-SQL:如何做到这一点:select * from xy where uid in (@parameter)
【发布时间】:2011-10-08 06:44:54
【问题描述】:

问题:

如何做到这一点:

DECLARE @StateUID varchar(max)  

SET @StateUID = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53, 66E57225-642F-45B5-8E5D-070F2D1CF99D, 751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 


SELECT StateFullName, StateAbbrv, StateID
FROM tblStates 
WHERE StateUID IN ( @StateID )

如下所示执行 string.join 也无济于事:

SET @StateUID = '''E8812237-2F3B-445E-8EEF-020E0B6F6A53'', ''66E57225-642F-45B5-8E5D-070F2D1CF99D'', ''751C615B-EB9C-4D25-955D-0E0EB3CD05A2''' 




我现在已将它移到动态 SQL 中,它可以在其中工作。

但这非常容易出错,烦人且耗时,所以我想问一下是否有任何非疯狂的方法(没有临时表、函数等)?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql reporting-services


    【解决方案1】:

    在这种情况下,您似乎可以使用“喜欢”

    DECLARE @QueryUIDs  varchar(MAX)
    SET @QueryUIDs = '''E8812237-2F3B-445E-8EEF-020E0B6F6A53'', ''66E57225-642F-45B5-8E5D-070F2D1CF99D'', ''751C615B-EB9C-4D25-955D-0E0EB3CD05A2''' 
    
    SELECT StateFullName, StateAbbrv, StateUID
    FROM tblStates 
    WHERE @QueryUIDs LIKE '%' + CAST(StateUID AS CHAR(36)) + '%'
    

    【讨论】:

    • 通过问题反转很好的解决方案。优雅而简单。它缺少对 varchar 的强制转换。我添加了细节。其他人,请注意@QueryUIDs 实际上是一个存储过程参数,由 JOIN(Parameters!in_location_new.Value, "' , '") 传递。
    【解决方案2】:

    一种选择是将逗号分隔的字符串解析为子查询。下面的代码假定您可以从 @StateUID 字符串中删除空格,并且 StateID 是唯一标识符:

    DECLARE @StateUID varchar(max), @xml xml  
    
    SET @StateUID = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53,' + 
        '66E57225-642F-45B5-8E5D-070F2D1CF99D,' + 
        '751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 
    
    SET @xml = '<root><r>' + replace(@StateUID,',','</r><r>') + '</r></root>'
    
    SELECT StateFullName, StateAbbrv, StateID
    FROM tblStates 
    WHERE StateID IN ( 
        SELECT
          CONVERT(uniqueidentifier, t.value('.','varchar(36)')) as [id]
        FROM @xml.nodes('//root/r') as a(t)
    ) 
    

    有很多很棒的string splitting functions,但我最喜欢使用XML

    【讨论】:

    • 这似乎与类似解决方案在同一基础上运行。我没有尝试,但我敢打赌它有效,所以 +1 也是。
    【解决方案3】:

    如果你不喜欢临时表和数组,你可以使用多个变量:

    DECLARE @StateUID_1 varchar(max)  
    DECLARE @StateUID_2 varchar(max)  
    DECLARE @StateUID_3 varchar(max)  
    
    SET @StateUID_1 = 'E8812237-2F3B-445E-8EEF-020E0B6F6A53'
    SET @StateUID_2 = '66E57225-642F-45B5-8E5D-070F2D1CF99D'
    SET @StateUID_3 = '751C615B-EB9C-4D25-955D-0E0EB3CD05A2' 
    
    
    SELECT StateFullName, StateAbbrv, StateID
    FROM tblStates 
    WHERE StateUID IN ( @StateUID_1, @StateUID_2, @StateUID_3 )
    

    【讨论】:

    • 运气不好,因为 UID 的数量是可变的(无限)。我只选择了 state 作为例子,它实际上是工作场所的 uid。
    • 如果是可变数量的 UID,那么数组或表是最好的解决方案(而且一点也不疯狂)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2011-04-06
    • 2017-09-27
    • 2016-06-24
    相关资源
    最近更新 更多