我真的不知道在这种情况下该做什么,所以不要太苛刻。
如果我有我的选择:
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吗?
答案 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;