代码之家  ›  专栏  ›  技术社区  ›  Brett

动态SQL查询(变量项和每列的变量项)

  •  0
  • Brett  · 技术社区  · 15 年前

    抱歉,这篇文章太长了,但大部分都是我的剧本:

    如果我有一张桌子:

    (dbo).(People)
    ID   Name   Age
    1    Joe    28
    2    Bob    32
    3    Alan   26
    4    Joe    27
    

    DECLARE @ID int, @Name nvarchar(25), @Age int
    SET @ID = 1
    SET @Name = 'Joe'
    SET @Age = null
    
    SELECT *
    FROM dbo.People
    WHERE
    (ID = @ID or @ID is null) AND
    (Name like @Name or @Name is null) AND
    (Age = @Age or @Age is null)
    

    DECLARE @text nvarchar(100)
    SET @text = '1, 3'
    
    DECLARE @ids AS TABLE (n int NOT NULL PRIMARY KEY)
    
    --//parse the string into a table
    DECLARE @TempString nvarchar(300), @Pos int
    SET @text = LTRIM(RTRIM(@text))+ ','
    SET @Pos = CHARINDEX(',', @text, 1)
    IF REPLACE(@text, ',', '') <> ''
    BEGIN
        WHILE @Pos > 0
        BEGIN
            SET @TempString = LTRIM(RTRIM(LEFT(@text, @Pos - 1)))
            IF @TempString <> '' --just: IF @TempString != ''
            BEGIN
                INSERT INTO @ids VALUES (@TempString)
            END
            SET @text = RIGHT(@text, LEN(@text) - @Pos)
            SET @Pos = CHARINDEX(',', @text, 1)
        END
    END
    
    
    SELECT *
    FROM   dbo.People
    WHERE  
    ID IN (SELECT n FROM @ids)
    

    现在,我的问题是我似乎不知道如何将两者结合起来,因为我不能把:

    WHERE
    (Name like @Name or @Name is null) AND
    (Id IN (SELECT n FROM @ids) or @ids is null)
    

    因为@ids永远不会为null(因为它是一个表)

    4 回复  |  直到 15 年前
        1
  •  0
  •   Cade Roux    15 年前

    尝试:

    (Id IN (SELECT n FROM @ids) OR NOT EXISTS (SELECT * FROM @ids))
    
        2
  •  1
  •   OMG Ponies    15 年前

    可以使用IF语句:

    IF LEN(@ids) > 0
    BEGIN
    
      SELECT *
        FROM dbo.People
       WHERE ID IN (SELECT n FROM @ids)
    
    END
    ELSE
    BEGIN
    
      SELECT *
        FROM dbo.People
    
    END
    

    否则, consider making the query real dynamic SQL (minding pitfalls of course) .

        3
  •  0
  •   Steve Broberg    15 年前

    您可以尝试:

    NOT EXISTS (SELECT 1 FROM @ids)
    OR EXISTS (SELECT 1 FROM @ids where n = Id) 
    

    但是这些表最好是小的—这个查询可能无法很好地处理表上的任何索引。

        4
  •  0
  •   Andomar    15 年前

    快速解决方案:

    (`%,' + Id + ',%' like ',' + @ids + ',' or @ids is null)
    and (`%,' + Name + ',%' like ',' + @names + ',' or @names is null)
    

    @ids = 1,2 ,第一行给出:

    `%,1,%' like ',1,2,'
    

    把逗号前后的空格过滤掉是个好主意

    推荐文章