我有一个用户定义的类型,如下所示
CREATE TYPE [dbo].[HaveItemUdt] AS TABLE(
[Defindex] [int] NULL
)
在我的存储过程中
@HaveItemList AS HaveItemUdt READONLY
SELECT * FROM tbl_something WHERE itemID IN (SELECT itemID FROM @HaveItemList)
当@HaveItemList为空时,我想像这样选择整个表
SELECT * FROM tbl_something WHERE itemID IN (SELECT itemID FROM tbl_something )
我试试这个但是不起作用
SELECT * FROM tbl_something WHERE itemID IN (SELECT itemID FROM @HaveItemList) OR @HaveItemList IS NULL
知道怎么做吗?
答案 0 :(得分:1)
您可以使用not exists
。
select *
from tbl_something
where ( not exists(select 1 from @HaveItemList )
or itemID in (select Defindex from @HaveItemList ))
这个想法是,如果@HaveItemList
为空,则第一部分将返回true,因此以下IN
子句被“忽略”
答案 1 :(得分:0)
您可以使用动态SQL执行此操作。
DECLARE @HaveItemList int
SET @HaveItemList = 5
DECLARE @sql nvarchar(max)
SET @sql = 'SELECT * FROM tbl_something WHERE itemID IN (SELECT itemID FROM '
SELECT @sql = @sql +
CASE
WHEN @HaveItemList IS NULL THEN ' TblSomething)'
ELSE '' + CAST(@HaveItemList AS varchar) + ')'
END
PRINT @sql
-- EXEC sp_executesql @sql -- Uncomment to execute the generated statement
如果您注释了设置@HaveItemList值的第二行,它将评估为NULL,并且将在表上完成选择。