带有AND语句的SQL,动态构建

时间:2015-11-19 12:12:51

标签: sql sql-server

目标:我正在构建一个动态SQL字符串,并希望将搜索设为AND函数

代码类型:SQL Server Management Studio中的SQL存储过程

问题:如果不需要第一次搜索,那么我需要知道这一点(我知道,因为在这种情况下,默认值是' 0'。我觉得我错过了一个保姆而不是#&# 39;似乎能够通过stackoverflow / Google获得解决方案。

我设置@QueryString,默认为''所以功能将起作用。

什么能解决这个问题?:

我已经考虑过COALESCE和IF ELSE在IF中的潜在用途,但我希望有一个干净的解决方案

SET @QUERYSTRING = IF(@QUERYSTRING = '','', + + ' FIELD1 LIKE ''%' +  LTRIM(RTRIM(@s1)) + '%' ) 

当前示例(摘录):

ALTER PROCEDURE [dbo].[spGridSearchTest]
    @s1 NVARCHAR(20), 
    @s2 VARCHAR(20)
AS
BEGIN

DECLARE @QUERY NVARCHAR(MAX)  = ''
DECLARE @QUERYSTRING NVARCHAR(MAX) = ''


SET @QUERY = 'SELECT * FROM TblTable'
IF @s1 <> '1234xyz'
    SET @QUERYSTRING =    @QUERYSTRING  + ' Field1 LIKE ''%' +  LTRIM(RTRIM(@s1)) + '%'

IF @s2 <> '1234xyz'
    SET @QUERYSTRING =    @QUERYSTRING  + ' Field2  LIKE ''%' +  LTRIM(RTRIM@s2)) + '%'

IF LEN(LTRIM(RTRIM(@QUERYSTRING)))  > 0 
    SET @QUERY = LTRIM(RTRIM(@QUERY)) + ' WHERE   ' +  LTRIM(RTRIM(@QUERYSTRING))    + '''' 

EXECUTE(@QUERY) 
END

2 个答案:

答案 0 :(得分:1)

如果我更了解你的问题:

试试这个:

ALTER PROCEDURE [dbo].[spGridSearchTest]
@s1 NVARCHAR(20), 
@s2 VARCHAR(20)

AS
BEGIN

    DECLARE @QUERY NVARCHAR(MAX)  = ''
    DECLARE @QUERYSTRING NVARCHAR(MAX) = ''

    DECLARE @conditionadded char(1) = 'N'

    SET @QUERY = 'SELECT * FROM TblTable'

    IF @s1 <> '1234xyz'
    BEGIN
        SET @QUERYSTRING = ' Field1 LIKE ''%' +  LTRIM(RTRIM(@s1)) + '%'
        SET @conditionadded = 'Y'
    END
    IF @s2 <> '1234xyz'
    BEGIN
        IF (@conditionadded = 'Y')
        BEGIN
            SET @QUERYSTRING = @QUERYSTRING + ' AND '
        END
        SET @QUERYSTRING = @QUERYSTRING  + ' Field2  LIKE ''%' +  LTRIM(RTRIM@s2)) + '%'
        SET @conditionadded = 'Y'
    END

    IF (@conditionadded = 'Y') 
    BEGIN
        SET @QUERY = LTRIM(RTRIM(@QUERY)) + ' WHERE ' +  LTRIM(RTRIM(@QUERYSTRING))    + '''' 
    END

    EXECUTE(@QUERY) 
END

答案 1 :(得分:0)

您真的需要动态查询吗?为什么不使用这样的东西:

select
 Whatever
from MyTable
where
 (@s1 = '1234xyz' or Field1 = @s1)
 and
 (@s2 = '1234xyz' or Field2 = @s2)

这可以避免安全漏洞,并且根据您的查询模式和数据集,它甚至可能更快。当然,它很容易阅读,你不必在字符串中处理SQL:)