如果用户定义的类型为null,则选择整个表

时间:2013-11-03 10:53:06

标签: sql sql-server

我有一个用户定义的类型,如下所示

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

知道怎么做吗?

2 个答案:

答案 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,并且将在表上完成选择。