SQL使用声明忽略子句项

时间:2016-06-06 19:56:35

标签: sql-server vb.net reporting-services

有没有办法根据声明值排除部分SQL语句?

例如;

DECLARE @OnlyY as VARCHAR(1) = 'Y'

SELECT count(*) from main where IDATE > '2016-01-01' 

If @OnlyY = 'Y' THEN
    AND Qualify = 'Y'
END IF

在这种情况下,如果@OnlyY不是Y,则if / endif之间的部分根本不会发生。

我需要这个的原因是因为我正在将Access 97应用程序移植到.NET。在Access 97应用程序中,有一个部件可以创建临时表,然后从该表生成报告。涉及的SQL是一组巨大的if / then语句,用于从临时表中删除数据。我可以构建DataTable以便在Datagridview中查看。我的问题是我无法让SSRS在if / then语句中具有与.NET相同的灵活性。

那我该怎么做呢?

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT COUNT(*) 
FROM main 
WHERE IDATE > '2016-01-01' AND 
      ((Qualify = 'Y') OR (@OnlyY <> 'Y'))

如果@OnlyY不等于'Y',则WHERE条款归结为:

WHERE IDATE > '2016-01-01'

否则,WHERE子句变为:

WHERE IDATE > '2016-01-01' AND (Qualify = 'Y')

答案 1 :(得分:1)

您可以查看的一个选项是Dynamic SQL,您可以在其中动态更改所需的任何内容。

 DECLARE @SQL AS NVARCHAR(MAX)
 SET @SQL = N'SELECT COUNT(*) FROM main WHERE IDATE > ''2016-01-01'''

 IF @OnlyY = 'Y'
 BEGIN 
   SET @SQL += N' AND Qualify = ''Y'''
 END

 EXECUTE sp_executesql @SQL