1

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

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

知道怎么做吗?

4

2 回答 2

2

你可以使用not exists.

select *
from tbl_something
where ( not exists(select 1 from @HaveItemList ) 
        or itemID in (select Defindex from @HaveItemList ))

这个想法是,如果第一部分@HaveItemList为空,则第一部分将返回 true,因此以下IN子句被“忽略”

于 2013-11-03T10:56:58.760 回答
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,并且将在表上完成选择。

于 2013-11-03T11:00:07.313 回答