Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 函数不返回多个结果_Sql_Sql Server_Tsql_Function - Fatal编程技术网

Sql 函数不返回多个结果

Sql 函数不返回多个结果,sql,sql-server,tsql,function,Sql,Sql Server,Tsql,Function,下面的函数返回一条记录而不是多条记录,这是我创建的标量值函数 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 @a

下面的函数返回一条记录而不是多条记录,这是我创建的标量值函数

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
知道如何返回多个结果吗

@安德烈:我非常感谢你!!我是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;
标量函数返回单个值。如果需要多个值,则需要一个表值函数

有关表值函数的详细信息,请参阅。

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

有关表值函数的更多详细信息,请参阅。

在“返回”部分,必须指定表而不是标量值

例如:

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
在“返回”部分中,必须指定表而不是标量值

例如:

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

只是重新创建了我的函数,如下所示,但仍然返回一条记录

 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;

只是重新创建了我的函数,如下所示,但仍然返回一条记录

 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;

我们开始……这项工作:

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;

我们开始……这项工作:

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;

您的是一个多语句表值函数。下面是一个内联表值函数,其作用与此相同:

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,因为它在复杂查询中使用时有更多的优化可能性:优化器不会为它准备一个单独的执行计划,而是将它的身体看作整个查询的一部分,以产生最佳的执行计划。


多语句函数的情况并非如此,它更像是外部查询的黑盒,因为它与调用它的查询的其余部分总是有一个单独的执行计划。

您的是一个多语句表值函数。下面是一个内联表值函数,其作用与此相同:

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,因为它在复杂查询中使用时有更多的优化可能性:优化器不会为它准备一个单独的执行计划,而是将它的身体看作整个查询的一部分,以产生最佳的执行计划。


多语句函数的情况并非如此,它更像是外部查询的黑盒,因为它总是有一个与调用它的查询的其余部分不同的执行计划。

不要使用变量。使用Insert直接将行插入@result表中。。。选择更好的是,将函数定义为内联表值函数:CREATE function。。。返回表作为返回选择资产/标记自…不要使用变量。使用Insert直接将行插入@result表中。。。选择更好的是,将函数定义为内联表值函数:CREATE function。。。返回表作为返回选择资产/标记来自…欢迎使用SO,Nazim!请综合你的答案。虽然回答自己的问题通常是可以的,但在某些情况下,即使有多个答案,后面的答案似乎会使前面的答案过时。最好删除以前的答案或使用“编辑”功能更新您的问题或答案。我开始讨论这个问题。所以这不是一个讨论论坛,年表在这里显示得不好。欢迎来到这里,纳齐姆!请综合你的答案。虽然回答自己的问题通常是可以的,但在某些情况下,即使有多个答案,后面的答案似乎会使前面的答案过时。最好删除以前的答案或使用“编辑”功能更新您的问题或答案。我开始讨论这个问题。因此,这不是一个讨论论坛,年表在这里显示得不好。