如何在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中是不可能的,函数可以是scalar
或table 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服务中将列名分配给标量函数的返回值的主要内容,如果未能解决你的问题,请参考以下文章