如何为sp选择添加通用条件?

时间:2015-08-02 10:54:36

标签: sql sql-server tsql

我真的不知道在这种情况下该做什么,所以不要太苛刻。

如果我有我的选择:

declare @Id uniqueidentifier = 'some parent guid'
declare @Type int = 1 -- can be 1, 2 or 3
declare @UserType varchar(max) --can be 0, anything else than 0, or all users at once

if(@Type = 1)
set @UserType = 'and UserType <> 0'
if(@Type = 2)
set @UserType = 'and UserType = 0'
if(@Type = 3)
set @UserType = ''
    select * from users where parentId = @Id + @UserType 

在条件为“通用”的情况下该怎么办?我真的需要创建3种不同的Sp吗?

2 个答案:

答案 0 :(得分:1)

您可以使用AND/OR逻辑来模拟If-else子句中的where条件。试试这样的事情

select * from users 
where
parentid= @id 
and 
(
(@Type = 1 and UserType <> 0)
or 
(@Type = 2 and UserType = 0)
or 
(@Type = 3)
)

或者您也可以使用Dynamic sql来执行此操作

declare @Id uniqueidentifier = 'some parent guid'
declare @Type int = 1 -- can be 1, 2 or 3
Declare @UserType varchar(max) --can be 0, anything else than 0, or all users at once
Declare @sql nvarchar(max)

if(@Type = 1)
set @UserType = ' and UserType <> 0'
if(@Type = 2)
set @UserType = ' and UserType = 0'
if(@Type = 3)
set @UserType = ''

set @sql = 'select * from users where parentId ='''+ cast(@Id as varchar(25))+''''+ @UserType 

--Print @sql

Exec sp_executesql @sql

答案 1 :(得分:0)

不同的select语句最有效,因为每个语句都是一个根本不同的查询。如果静态SQL变得难以使用,请使用动态SQL。以下是使用http://www.sommarskog.se/dyn-search.html中的技术的参数化示例。

declare @sql nvarchar(MAX) = N'select * from users where parentId = @Id';
declare @Id uniqueidentifier = 'some parent guid';
declare @Type int = 1; -- can be 1, 2 or 3
declare @UserType varchar(max); --can be 0, anything else than 0, or all users at once

SET @sql = @sql + CASE @Type
    WHEN 1 THEN N' and UserType <> 0'
    WHEN 2 THEN N' and UserType = 0'
    WHEN 3 THEN N'' END;

EXEC sp_executesql
      @sql
    , N'@Id uniqueidentifier'
    , @Id = @Id;