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 の値が設定されている 2 行目をコメントすると、NULL と評価され、テーブルで選択が行われます。

于 2013-11-03T11:00:07.313 に答える