Sql 存储过程中的一个'AND'中的动态where子句

Sql 存储过程中的一个'AND'中的动态where子句,sql,sql-server,stored-procedures,if-statement,case,Sql,Sql Server,Stored Procedures,If Statement,Case,我有一个非常大的存储过程,我不能分享,但我只是在实现一个动态where子句时遇到了麻烦,它已经有7个AND。在WHERE子句的最后一个'And'中,我需要检查传递给存储过程的参数,并相应地构造'And'。基本上,用户可以向存储过程传入买方或卖方或指示两者都使用的空字符串。需要的算法: SELECT blah blah blah FROM multiple joins, left outer joins blah WHERE (1st clause) AND (2nd clause) AND

我有一个非常大的存储过程,我不能分享,但我只是在实现一个动态where子句时遇到了麻烦,它已经有7个AND。在WHERE子句的最后一个'And'中,我需要检查传递给存储过程的参数,并相应地构造'And'。基本上,用户可以向存储过程传入买方或卖方或指示两者都使用的空字符串。需要的算法:

SELECT blah blah blah 
FROM multiple joins, left outer joins blah
WHERE 
(1st clause) AND
(2nd clause) AND 
(3rd clause) AND 
(4th clause) AND 
(5th clause) AND 
(6th clause) AND 
(7th clause) AND
(need to check paramater passed in and fill in this and accordingly....
Basically in JS terms:
if (parameter ='buyer'){
 B.S_FNAME LIKE '%' + @Name + '%' OR 
 B.S_SNAME LIKE '%' + @Name + '%'
}
else if (parameter = 'seller'){
 S.S_FNAME LIKE '%' + @Name + '%' OR
 S.S_SNAME LIKE '%' + @Name + '%'
}
else{
 B.S_FNAME LIKE '%' + @Name + '%' OR 
 S.S_FNAME LIKE '%' + @Name + '%' OR 
 B.S_SNAME LIKE '%' + @Name + '%' OR 
 S.S_SNAME LIKE '%' + @Name + '%'
}
 ) 
我的尝试如下所示,其中@CliType是传入的参数:

AND (CASE 
        WHEN @CliType  = 'Buyer' THEN  
        B.S_FNAME LIKE '%' + @Name + '%' OR 
        B.S_SNAME LIKE '%' + @Name + '%'
        WHEN @CliType  = 'Seller' THEN 
        S.S_FNAME LIKE '%' + @Name + '%' OR
        S.S_SNAME LIKE '%' + @Name + '%'
        WHEN @CliType = '' THEN 
        B.S_FNAME LIKE '%' + @Name + '%' OR 
        S.S_FNAME LIKE '%' + @Name + '%' OR 
        B.S_SNAME LIKE '%' + @Name + '%' OR 
        S.S_SNAME LIKE '%' + @Name + '%'
        END)

但这给了我第一个LIKE和第二个WHEN下的错误行。我使用的是SQLServer2008,没有太多的使用经验。感谢任何帮助

案例陈述并非如此。基本思想是对您试图检查的每个条件使用类似的语法

AND (CASE 
    WHEN @CliType  = 'Buyer' THEN  
    B.S_FNAME WHEN @CliType  = 'Seller' THEN 
    S.S_FNAME WHEN @CliType = '' THEN 
    B.S_FNAME END LIKE '%' + @Name + '%' )
OR..

请试试这个,希望有用

DECLARE @CliType VARCHAR(100);

DECLARE @Name VARCHAR(100);

DECLARE @TableBuyer TABLE (ID INT,
                          S_FNAME VARCHAR(100),
                          S_SNAME VARCHAR(100));

DECLARE @TableSeller TABLE (ID INT,
                           S_FNAME VARCHAR(100),
                           S_SNAME VARCHAR(100));

--Assign your input parameters here
SET @CliType = 'Buyer' --NULL
SET @Name = 'Daniella'

INSERT INTO @TableBuyer
SELECT '1','Bryan', 'Greenberg' UNION ALL
SELECT '2','Channing', 'Tatum' UNION ALL
SELECT '3','Paul', 'William' UNION ALL
SELECT '4','Eric', 'Bana' UNION ALL
SELECT '5','James', 'Lafferty' UNION ALL
SELECT '6','Wentworth', 'Miller'

INSERT INTO @TableSeller
SELECT '1','Dianna', 'Agron' UNION ALL
SELECT '2','Malin', 'Akerman' UNION ALL
SELECT '3','Christina', 'Aguilera' UNION ALL
SELECT '4','Jessica', 'Alba' UNION ALL
SELECT '5','Krista', 'Allen' UNION ALL
SELECT '6','Daniella', 'Alonso'


SELECT b.ID,b.S_FNAME,b.S_SNAME,s.ID,s.S_FNAME,s.S_SNAME
FROM @TableBuyer b
JOIN @TableSeller s
ON b.ID=s.ID
WHERE (@CliType = 'Buyer'
 AND (B.S_FNAME LIKE '%' + @Name + '%'
   OR B.S_SNAME LIKE '%' + @Name + '%'))
  OR (@CliType = 'Seller'
 AND (S.S_FNAME LIKE '%' + @Name + '%'
   OR S.S_SNAME LIKE '%' + @Name + '%'))
  OR (ISNULL(@CliType, '') = ''
 AND (B.S_FNAME LIKE '%' + @Name + '%'
   OR S.S_FNAME LIKE '%' + @Name + '%'
   OR B.S_SNAME LIKE '%' + @Name + '%'
   OR S.S_SNAME LIKE '%' + @Name + '%'));

您可以解析参数并构建一个字符串变量,插入select语句

if  @CliType  = 'Buyer' 
  THEN @WhereVariable = B.S_FNAME LIKE '''%''' + @Name + '''%''' OR...'
else if @CliType = 'Seller' then ...

然后将其插入到一个字符串中,该字符串最终成为完整查询,并使用

执行它,感谢您的响应。您的答案是在ManagementStudio中返回正确的结果,但在我用php调用该过程时超时。有12000个结果被授予,但在我添加额外的行之前,这个过程是从php端运行的,结果非常大。知道为什么吗?不客气。超时可能是由于几个原因造成的,但由于您说它以前工作过,只是从应用程序超时,并且从SSMS运行良好,因此我怀疑执行计划。请使用EXECUTE sp_recompile[SPNAME]强制刷新缓存的执行计划。同时运行sp_updatestats以确保安全。希望能有帮助。感谢您的回复,我不确定案例中的第三行是否符合标准?如果用户未通过,那么我们需要同时检查b.S_FNAME和S.S_FNAME?