表值参数默认值或传递内联

时间:2016-05-18 07:53:01

标签: sql sql-server

参见下面的例子,

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

我想找到一种方法:

  
      
  1. 为@c参数
  2. 指定默认值   
  3. 在帮助函数中内联传递
  4.   

我发现无法做到这一点。 有人可以帮忙吗?

p.s。:我正在使用Microsoft SQL Server 2012(或更新版本)

1 个答案:

答案 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