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!请综合你的答案。虽然回答自己的问题通常是可以的,但在某些情况下,即使有多个答案,后面的答案似乎会使前面的答案过时。最好删除以前的答案或使用“编辑”功能更新您的问题或答案。我开始讨论这个问题。所以这不是一个讨论论坛,年表在这里显示得不好。欢迎来到这里,纳齐姆!请综合你的答案。虽然回答自己的问题通常是可以的,但在某些情况下,即使有多个答案,后面的答案似乎会使前面的答案过时。最好删除以前的答案或使用“编辑”功能更新您的问题或答案。我开始讨论这个问题。因此,这不是一个讨论论坛,年表在这里显示得不好。