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

时间:2010-07-15 20:45:14

标签: sql sql-server sql-server-2008 stored-procedures

很抱歉很长的帖子,但大部分是代码拼写我的方案:

我正在尝试执行动态查询(希望通过存储的进程)来根据可变数量的输入检索结果。

如果我有一张桌子:

(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 个答案:

答案 0 :(得分:1)

您可以使用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)

答案 1 :(得分:0)

您可以尝试:

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

但是这些更好的是小表 - 这个查询可能不会很好地与你表上的任何索引一起使用。

答案 2 :(得分:0)

尝试:

(Id IN (SELECT n FROM @ids) OR NOT EXISTS (SELECT * FROM @ids))

答案 3 :(得分:0)

快速修复:

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

因此,如果用户通过@ids = 1,2,则第一行会显示:

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

在逗号之前和之后过滤空格是个好主意。 :)