我有一个UDF,它需要始终返回相同的数据集结构,列a、b、c和d。它需要从多个数据源返回UNION ALL,包括其他UDF:s。
假设我有另一个返回列a和b的函数(myOtherUDF)。我还有一个表(myTable),其列名为a、b、c和d。我想做的是在myOtherUDF和myTable上以一种方式将列c和d添加到myOtherUDF上。
。我希望这个工作,虽然myOtherUDF缺乏列c和d:
CREATE FUNCTION myUDF (@param INT)
RETURNS @tbl TABLE
(
a int NOT NULL,
b int NOT NULL,
c int NOT NULL,
d int NOT NULL
)
AS
BEGIN
INSERT INTO @tbl
SELECT * FROM myTable
UNION ALL // this will obviously not work
SELECT * FROM myOtherUDF(@param)
RETURN
END
我不能使用进程来预加载表,也不能使用视图,因为我需要参数@param。
如果您显式列出您的列—这是最佳实践—您立即解决了这个问题,在myOtherUDF
中添加c
和d
的默认值之后;
INSERT INTO @tbl (a, b, c, d)
SELECT a, b, c, d
FROM myTable
UNION ALL
SELECT a, b, 0, 0
FROM myOtherUDF(@param);
RETURN;
要清楚,如果不列出列,您几乎永远不应该使用select *
和insert into table
。这样可以省去很多麻烦。
出于性能考虑,使用内联表值函数几乎总是更好,例如
CREATE FUNCTION myUDF
(
@param INT
)
RETURNS TABLE
RETURN
SELECT a, b, c, d
FROM myTable
UNION ALL
SELECT a, b, 0, 0
FROM myOtherUDF(@param);