如何根据几个uniqueidentifier获取多行?

时间:2010-07-27 13:53:19

标签: sql sql-server

我正在努力做出这样的选择:

DECLARE @ContentIDs VARCHAR(MAX);

SELECT @ContentIDs = 'e28faa48-adea-484d-9d64-ba1e1c67eea3,8338A6DE-8CDF-4F52-99CE-62E2B107FF97'

SELECT * FROM [Content] WHERE [ID] IN (@ContentIDs)

它仅返回第一个UNIQUEIDENTIFIER的内容。

如何检索所有行?

4 个答案:

答案 0 :(得分:4)

你可以

  1. 使用动态SQL生成查询,但需要确保列表已清理

  2. 使用拆分函数来解析列表,并将每个条目作为一行添加到表变量中,然后将其加入到该表或

  3. 使用SELECT * FROM [Content] WHERE @ContentIDs like '%' + cast([ID] as varchar(36)) + '%'这将强制执行完整扫描,但如果您匹配多行,则这可能无关紧要。 (编辑,但如果匹配多行,则比较字符串可能很大!)

  4. 选项2通常是我的首选方法。或者您可以使用CTE执行类似的操作(基于approach here

    DECLARE @ContentIDs VARCHAR(MAX);
    
    SET @ContentIDs = 'e28faa48-adea-484d-9d64-ba1e1c67eea3,8338A6DE-8CDF-4F52-99CE-62E2B107FF97';
    
    WITH Guids(pn, start, [stop]) AS
    (
          SELECT 1, cast(1 as bigint), CHARINDEX(',', @ContentIDs)
          UNION ALL
          SELECT pn + 1, [stop] + 1, CHARINDEX(',', @ContentIDs, [stop] + 1)
          FROM Guids
          WHERE [stop] > 0
    )
    
    SELECT <collist> FROM 
    [Content] 
    WHERE [ID] IN (
        SELECT 
        CAST(LTRIM(RTRIM(SUBSTRING(@ContentIDs, start, 
           CASE WHEN [stop] > 0 
                THEN [stop]-start 
                ELSE LEN(@ContentIDs) END))) AS UNIQUEIDENTIFIER)
        FROM Guids where  [stop] > 0 or start>1
        )
    

答案 1 :(得分:3)

那是因为“IN”需要一个表,你给它一个字符串。即使按照建议的“喜欢”,它也会非常草率,你的结果根本就不准确。

您需要以下内容将字符串转换为表格才能生效:

CREATE FUNCTION [dbo].[split] (

    @sourcestring varchar(8000),
    @spliton varchar(1)
)

RETURNS @split table(value sql_variant)

AS  
BEGIN 

    while (charindex(@spliton,@sourcestring)>0)
        begin
            insert into @split
            select value = ltrim(rtrim(substring(@sourcestring,1,charindex(@spliton,@sourcestring)-1)))

            set @sourcestring = substring(@sourcestring,charindex(@spliton,@sourcestring) + len(@spliton),len(@sourcestring))
        end
    insert into @split select value = ltrim(rtrim(@sourcestring))

    RETURN

END

然后像这样称呼它:

DECLARE @ContentIDs VARCHAR(MAX);

SELECT @ContentIDs = 'e28faa48-adea-484d-9d64-ba1e1c67eea3,8338A6DE-8CDF-4F52-99CE-62E2B107FF97'

SELECT * FROM [Content] WHERE [ID] IN (select value from dbo.split(@ContentIDs,','))

答案 2 :(得分:1)

您可以使用以逗号分隔的列表进行字符串比较:

SELECT * 
FROM [Content] 
WHERE ',' + @ContentIDs + ',' LIKE '%,' + CONVERT(varchar, [ID]) + ',%'

答案 3 :(得分:1)

尝试:

SELECT @SQL = 'SELECT * FROM [Content] WHERE [ID] IN (' + @ContentIDs + ')'
EXEC (@SQL)