0

以下の関数は、複数ではなく 1 つのレコードを返します。これは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;
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

次のように関数を再作成しましたが、まだ1つのレコードを返します

 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 に答える
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 に答える