可能不是最好的头衔但反正..
我有一个存储过程,直到现在有一个可选参数,我很容易用1 if语句解决。现在它有2个,最多可以有4个if语句。我想知道是否有更好的方法来编写查询,然后如下。特别是当变量计数达到4或5时。
我正在寻找一种更简单的方法来添加这个新的ignoreTheseIds变量,而不必再添加2个if / else语句。
ALTER PROCEDURE [dbo].[SomeQuery]
@StartingDate varchar(10) = '1/1/1900',
@EndingDate varchar(10) = NOW,
@LimitToTheseIds varchar(MAX) = ''
@IgnoreTheseIds varchar(MAX) = ''
AS
BEGIN
SET NOCOUNT ON;
IF @LimitTo = ''
BEGIN
SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
AND SomeDateTime >= @StartDate
END
ELSE
BEGIN
SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
AND SomeDateTime >= @StartDate
AND @LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%'
END
END
希望在更改var名称时没有弄乱任何东西...
答案 0 :(得分:2)
您可以检查是否传递了任何内容:
ALTER PROCEDURE [dbo].[SomeQuery]
@StartingDate varchar(10) = '1/1/1900',
@EndingDate varchar(10) = NOW,
@LimitToTheseIds varchar(MAX) = ''
@IgnoreTheseIds varchar(MAX) = ''
AS
BEGIN
SET NOCOUNT ON;
SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
AND SomeDateTime >= @StartDate
AND (@LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%'
OR @LimitToTheseId = '')
END
答案 1 :(得分:2)
这是我遇到的关于动态搜索条件的最全面的文章:
答案 2 :(得分:0)
您可以使用CASE语句,但是您需要检查是否通过这样做来提高效率。像这样:
ALTER PROCEDURE [dbo].[SomeQuery]
@StartingDate varchar(10) = '1/1/1900',
@EndingDate varchar(10) = NOW,
@LimitToTheseIds varchar(MAX) = ''
@IgnoreTheseIds varchar(MAX) = ''
AS
BEGIN
SET NOCOUNT ON;
SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
AND SomeDateTime >= @StartDate
AND @LimitToTheseIds LIKE CASE WHEN @LimitToTheseIds = '' THEN '' ELSE '%|' + CAST(id1 as varchar) + '|%' END
AND @IgnoreTheseIds LIKE CASE WHEN @IgnoreTheseIds = '' THEN '' ELSE /*something appropriate here*/
END
等
答案 3 :(得分:0)
SELECT id1, col2
FROM Table1 as T
WHERE SomeDateTime <= @EndDate
AND SomeDateTime >= @StartDate
AND (@LimitToTheseIds IS NULL OR @LimitToTheseIds LIKE '%|' + CAST(id1 as varchar) + '|%')
答案 4 :(得分:-1)
当我不得不像这样编写更大的SPROCS时,我添加了一个“Type”变量,该变量将转到SPROC中的特定语句。例如:
@queryType = 'A'
if @queryType = 'A'
begin
--do query A
end
if @queryType = 'B'
begin
--do query B
end
--etc.
它最终比拥有多棵树更清洁。