2013-08-20 63 views
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 #"[email protected]) 


    -- 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 @[email protected] + "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

欢迎来到SO,Nazim!请整理你的答案。尽管回答你自己的问题通常是可以的,但在某些情况下,即使有多个答案,在这里,后面的答案似乎使先前的过时。删除以前的答案或使用“编辑”功能更新您的问题或答案会更好。我开始讨论[关于这个Q的meta](http://meta.stackexchange.com/questions/197702/what-to-do-do-when-an-author-writes-multiple-answers-to-develop-the-溶液同时)。 SO并不是一个讨论论坛,在这里,年代表并不好。 – cfi

回答

2

标量函数返回一个值。如果您需要多个值,您需要一个表值函数。有关表值函数的更多详细信息,请参阅here

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 
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 #"[email protected]) 

    IF @ticket IS NOT NULL 
    BEGIN 
    INSERT @result 
    SELECT @Asset_Tag 
    END; 

    RETURN; 
    end; 
+0

做**不**使用变量。直接使用INSERT ... SELECT将行插入到@结果表中。更好的是,将你的函数定义为* inline *表值函数:'CREATE FUNCTION ...(...)RETURNS TABLE AS RETURN SELECT“Asset/Tag#”FROM ...'。 –

+0

任何其他的想法? – Nazim

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 #"[email protected]) 

    RETURN 
end; 
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,它在复杂的查询中使用时,打开了优化更多的可能性更好:优化器将不单独准备执行计划,而是将其主体视为整个查询的一部分,以便提出最佳可能的执行计划。

对于多语句函数来说,情况并非如此,对于使用的外部查询而言,它更像是一个黑盒子,因为它始终与查询的其余部分有单独的执行计划,称它。