功能不返回多个结果

时间:2013-08-20 20:35:58

标签: sql sql-server tsql function

下面的函数返回一条记录而不是多条记录,这是我创建的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

知道如何返回多个结果?


@Andriy M非常感谢你!我是tsql的新手,所以我根据我的逻辑创建了这个函数!

我的功能的目的是显示列的分隔字符串值(请不要问我原因),这是我目前工作正常的结局函数,让我知道是否有什么需要改进和/或改变:

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;

5 个答案:

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

答案 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,因为它在复杂查询中使用时会为优化提供更多可能性:优化者不会为它准备单独的执行计划,而是将其身体视为整体的一部分查询以便提出最佳的执行计划。

多语句函数不是这种情况,对于正在使用的外部查询,它更像是一个黑盒子,因为它始终与调用的其余查询有一个单独的执行计划它