参见下面的例子,
CREATE TABLE Test
(
CD varchar(10) not null
)
GO
INSERT INTO Test VALUES ('TEST')
GO
CREATE TYPE [CdTable] AS TABLE (CD varchar(10));
GO
CREATE FUNCTION TestTbl ( @x varchar(10), @c CdTable READONLY )
RETURNS TABLE
AS
RETURN
SELECT t.CD
FROM test t
JOIN @c c ON t.CD = c.CD OR c.CD IS NULL
WHERE t.CD = @x
GO
DECLARE @tt AS CdTable;
INSERT INTO @tt VALUES ('TEST');
SELECT * FROM TestTbl('TEST', @tt);
DELETE FROM @tt;
INSERT INTO @tt VALUES (NULL);
SELECT * FROM TestTbl('TEST', @tt);
GO
CREATE FUNCTION TestNoTbl ( @x varchar(10) )
RETURNS TABLE
AS
RETURN
SELECT *
FROM TestTbl(@x, ???? ) --<<<< how do I pass inline @c parameter with only a single row set to NULL
GO
我想找到一种方法:
- 为@c参数
指定默认值- 在帮助函数中内联传递
醇>
我发现无法做到这一点。 有人可以帮忙吗?
p.s。:我正在使用Microsoft SQL Server 2012(或更新版本)
答案 0 :(得分:1)
首先,您无法为Table Valued parameter
分配默认值。相反,你可以改变功能。
将INNER JOIN
更改为LEFT OUTER JOIN
SELECT t.CD
FROM test t
LEFT OUTER JOIN @c c ON t.CD = c.CD
WHERE t.CD = @x
即使@c
没有任何记录,您也会根据@x过滤器获得结果
更新:根据您的评论
If exists(select 1 from @c)
SELECT t.CD
FROM test t
JOIN @c c ON t.CD = c.CD
WHERE t.CD = @x
Else
SELECT t.CD
FROM test t
WHERE t.CD = @x