0

下面的函数返回一条记录而不是多条记录,这是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 还很陌生,所以我根据我的逻辑创建了这个函数!

我的函数的目的是显示列的分隔字符串值(请不要问我为什么),这是我的 finale 函数,目前工作正常,如果有什么需要改进和/或更改的,请告诉我:

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;
4

5 回答 5

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
于 2013-08-20T20:41:52.300 回答
2

标量函数返回单个值。如果您需要多个值,则需要一个表值函数。

有关表值函数的更多详细信息,请参见此处

于 2013-08-20T20:41:31.767 回答
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 更好,因为它在复杂查询中使用时为优化提供了更多可能性:优化器不会为其准备单独的执行计划,而是将其主体视为整个查询的一部分,以便提出可能的最佳执行计划。

多语句函数并非如此,它更像是一个关于正在使用的外部查询的黑匣子,因为它始终具有与调用它的其余查询不同的执行计划。

于 2013-09-17T05:01:41.883 回答
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;
于 2013-09-16T16:59:29.337 回答
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;
于 2013-08-21T18:45:11.233 回答