如何在sql服务中将列名分配给标量函数的返回值

Posted

技术标签:

【中文标题】如何在sql服务中将列名分配给标量函数的返回值【英文标题】:How to assign column name to return value of scalar function in sql serve 【发布时间】:2018-02-07 07:19:27 【问题描述】:

我在 sql 函数中定义了一个函数,它输入 3 个名称(三个 varchar)并输出一个名称(一个 varchar)'。我只想给这个返回值一个名称/列名。

现在当我调用我的函数时:

select concat_names(@first_name, @middle_name,@last_name)

我看到返回的 varchar 没有列名

这里是完整的代码:

if object_id('[co1].[concat_names]') is not null
    drop function [co1].[concat_names];
go
create function [co1].[concat_names]
(
    @first_name varchar(20),
    @middle_name varchar(20),
    @last_name varchar(20)
)
returns varchar(62)
as
begin
    declare @full_name varchar(62)
    set @full_name = @first_name;
    if(@middle_name is not null)
    set @full_name = @full_name + ' ' + @middle_name;
    if(@last_name is not null)
    set @full_name = @full_name + ' ' + @last_name;
    return @full_name;
end
go

当我这样做时:

select concat_names('A', 'B', 'C')

我在结果集中没有得到列名。 我知道我可以在上面的选择查询中将列名作为无列名返回后重命名。

我只想知道,如果有什么方法可以在返回值的同时命名列

【问题讨论】:

请给出你的功能代码以及使用代码和结果 嗯,就是在调用函数时重命名。我想在返回值时给出列名 【参考方案1】:

试试这个:

select fullname(@fn, @mn,@ln) AS 'yourName'

您可以创建表值函数来返回带有名称的列,例如:

create function udf_ParseDate (
 @date as datetime
) returns @dateinfo table (
 id int identity(1,1),
 [date] datetime,
 [year] int,
 [month] smallint,
 [day] smallint
)
as
begin
 insert into @dateinfo
 select @date, YEAR(@date), MONTH(@date), DAY(@date)

 return;
end

在您的代码中:

if object_id('[co1].[concat_names]') is not null
    drop function [co1].[concat_names];
go
create function [co1].[concat_names]
(
    @first_name varchar(20),
    @middle_name varchar(20),
    @last_name varchar(20)
)
returns returns @info table (
   fullName varchar(256)
)
as
begin
    declare @full_name varchar(62)
    set @full_name = @first_name;
    if(@middle_name is not null)
    set @full_name = @full_name + ' ' + @middle_name;
    if(@last_name is not null)
    set @full_name = @full_name + ' ' + @last_name;
    insert into @info select @full_name;
    return;
end
go

【讨论】:

嗯,就是在调用函数时重命名。我想在返回值时给出列名 我知道,你可以从UDT返回表,但它的效率不如标量,我要求不高,只是愿意给出一个返回名称......同时提到'return varchar(62 )' ...我只想使用'return varchar(62) as fullname'。 @Cellman 你的请求在sql server中是不可能的,函数可以是scalartable value【参考方案2】:

这样做:

SELECT fullname(@fn, @mn,@ln) AS COLUM_NAME_YOU_WANT

像这样创建你的函数:

    create function concatall (
     @fn as TEXT, 
     @mn as TEXT,
     @ln as TEXT
    ) returns @merged table (
     [FullName] TEXT
    )
    as
    begin
     insert into @merged 
SELECT CONCAT(@fn , @mn , @ln)


     return;
    end

【讨论】:

嗯,就是在调用函数时重命名。我想在返回值时给出列名【参考方案3】:

您正在寻找的内容在 SQL Server 中对于标量值函数是不可能的。即使是默认的 SQL Server 标量值函数也返回带有 (无列名)

的数据

例如

 select Checksum('somedata')

输出

    (No column name)
 ---------------------
    -1791257452

如果您可以使用别名,我不确定您为什么希望列名来自函数,您得到什么好处?

如果您只是想知道它是否可能,那么答案是“否”。

您唯一的选择是使用带有AS 的别名,例如follwong。

SELECT fullname(@fn, @mn,@ln) AS FullName

【讨论】:

非常全面的回答,谢谢!我需要它来获得更好的文档。在创建图表时,我想给返回值一个相关的名称,所以希望在真实的 SQL 脚本中也能提到相同的返回值名称。 我确实帮了我帮不了忙 :D

以上是关于如何在sql服务中将列名分配给标量函数的返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中将函数作为输出值返回?

如何在sql server中的标量函数中传递列名[关闭]

在用户定义的函数中返回列名而不是值 SQL

T-SQL编程 —— 用户自定义函数(标量函数)

从 TSQL 标量函数返回连接值

我可以以任何方式从 OpenCV 对象取消引用中将数据分配给双重函数返回检索吗?