下面的函数返回一条记录而不是多条记录,这是我创建的Scalar-valued
函数...
ALTER FUNCTION [_SMDBA_].[ASSETTAG](@ticket int)
RETURNS VARCHAR(MAX)
AS
BEGIN
-- Declare the return variable here (asset#)
DECLARE @assettag VARCHAR(MAX)
-- Query to return all the tasset #s
SELECT @assettag = "Asset/Tag #"
FROM sde."_SMDBA_"."Inventory Items"
WHERE "Configuration ID" = (SELECT "Client ID"
FROM sde."_SMDBA_"."Incident"
WHERE "Incident #"=@ticket)
-- Return the result of the function
RETURN @assettag
END
知道如何返回多个结果?
我的功能的目的是显示列的分隔字符串值(请不要问我原因),这是我目前工作正常的结局函数,让我知道是否有什么需要改进和/或改变:
ALTER FUNCTION [_SMDBA_].[ASSETTAG3](@ticket int)
RETURNS @result TABLE
(Asset# nvarchar(50))
AS
BEGIN
Declare @concat varchar(50)
set @concat=''
SELECT @concat=@concat + "Asset/Tag #" +' / ' from sde."_SMDBA_"."Inventory Items"
where "Configuration ID"=(select "Client ID" from "_SMDBA_"."Clients" where "Client Name"=(select "Req Full Name" from "_SMDBA_"."Incident" where "Incident #"=(@ticket)))
INSERT into @result
select @concat
RETURN
end;
答案 0 :(得分:3)
在RETURNS
部分中,您必须指定TABLE
而不是标量值。
示例:
ALTER FUNCTION [_SMDBA_].[ASSETTAG](@ticket int)
RETURNS @Result TABLE --Notice the return type is a table
(
-- Table Schema
AssetTag VARCHAR(MAX)
)
AS
BEGIN
-- Insert data into @Result
INSERT INTO @Result
SELECT 'Tag A'
INSERT INTO @Result
SELECT 'Tag B'
-- Return Table
RETURN @Result
END
答案 1 :(得分:2)
标量函数返回单个值。如果您需要多个值,则需要表格值功能。
有关表格值函数的更多详细信息,请参阅here。
答案 2 :(得分:0)
重新创建我的函数如下,但仍然返回一条记录
ALTER FUNCTION [_SMDBA_].[ASSETTAG2](@ticket int)
RETURNS @result TABLE
(
ticket nvarchar(10) NULL
)
AS
BEGIN
Declare
@Asset_Tag nvarchar(10);
SELECT
@Asset_Tag = "Asset/Tag #" from sde."_SMDBA_"."Inventory Items"
where "Configuration ID"=(select "Client ID" from sde."_SMDBA_"."Incident" where "Incident #"=@ticket)
IF @ticket IS NOT NULL
BEGIN
INSERT @result
SELECT @Asset_Tag
END;
RETURN;
end;
答案 3 :(得分:0)
我们去......这项工作:
CREATE FUNCTION [_SMDBA_].[ASSETTAG3](@ticket int)
RETURNS @result TABLE
(Asset# nvarchar(10))
AS
BEGIN
INSERT into @result
SELECT "Asset/Tag #" from sde."_SMDBA_"."Inventory Items"
where "Configuration ID"=(select "Client ID" from sde."_SMDBA_"."Incident" where "Incident #"=@ticket)
RETURN
end;
答案 4 :(得分:0)
你的是一个多语句表值函数。这是一个内联表值函数:
CREATE FUNCTION [_SMDBA_].[ASSETTAG3] (@ticket int)
RETURNS TABLE
AS
RETURN
SELECT "Asset/Tag #" AS "Asset#"
FROM sde."_SMDBA_"."Inventory Items"
WHERE "Configuration ID" = (
SELECT "Client ID"
FROM sde."_SMDBA_"."Incident"
WHERE "Incident #" = @ticket
)
;
内联TVF优于多语句TVF,因为它在复杂查询中使用时会为优化提供更多可能性:优化者不会为它准备单独的执行计划,而是将其身体视为整体的一部分查询以便提出最佳的执行计划。
多语句函数不是这种情况,对于正在使用的外部查询,它更像是一个黑盒子,因为它始终与调用的其余查询有一个单独的执行计划它