如何使用 UDF Scalar 函数打印字母?
Posted
技术标签:
【中文标题】如何使用 UDF Scalar 函数打印字母?【英文标题】:How to print Alphabets using UDF Scalar function? 【发布时间】:2017-02-10 04:59:29 【问题描述】:我正在尝试通过创建 UDF 标量函数来打印字母。 这是我的代码:
create function [dbo].[fnalphabets]()
returns varchar
as begin
declare @num int=65
while(@num<=90)
begin
set @num=@num+1
end
return char(@num)
end
当我使用
调用此函数时select dbo.fnalphabets()
它没有返回预期的结果。谁能告诉我我的代码有什么问题?
【问题讨论】:
预期输出 我想打印从 A 到 Z 的字母 你正在循环遍历所有函数,但最后只返回一个函数! 是的,但是如何全部打印? 【参考方案1】:不需要循环或函数任何东西。只需从master
数据库中获取Spt_Values
表中的数字并将它们转换为Char
SELECT CHAR(number)
FROM master.dbo.spt_values
WHERE type = 'p'
AND NUMBER BETWEEN 65
AND 90
ORDER BY NUMBER
编辑: 来自评论:上述代码的 UDF
Go
ALTER FUNCTION [dbo].[fnalphabets]()
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @Alphabates VARCHAR(130)='';
SELECT @Alphabates = @Alphabates +CHAR(number) +'
'
FROM master.dbo.spt_values
WHERE type = 'p'
AND NUMBER BETWEEN 65
AND 90
ORDER BY NUMBER
RETURN @Alphabates
END
【讨论】:
是的,但我想通过使用标量 UDF 来做到这一点 把上面的select放到一个函数里。并称它为@JasonClark【参考方案2】:试试这个:我在这里更改了它的返回 varchar 大小并声明变量以存储字母字符串。并将 char 值存储在 while 循环中。如下并返回相同的字母字符串。
CREATE FUNCTION [dbo].[fnalphabets]()
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @num INT=65
DECLARE @Alphabates VARCHAR(100)=''
WHILE(@num<=90)
BEGIN
SET @Alphabates=@Alphabates+char(@num)
SET @num=@num+1
END
RETURN @Alphabates
END
【讨论】:
它工作正常,但请你解释一下@Alphabates 的作用 它只是保存返回值,即您将在调用代码中打印的 a-z 字母。 @JaydipJ 我想再问一件事,我们可以使用@num
保存值并通过return char(@num
返回其值)但是为什么它不像@Alphabates
那样工作?
以及为什么我们在 DECLARE @Alphabates VARCHAR(100)=''
中使用 VARCHAR(100)=''
?因为我们可以简单地使用DECLARE @Alphabates VARCHAR(100)
来保存值
是的,但是当我只使用DECLARE @Alphabates VARCHAR(100)
时它返回NULL
【参考方案3】:
试试这个:您可以使用Table Valued Functions
,如下所示,它会在单独的行中为您提供每个 A-Z:
CREATE FUNCTION [dbo].[fnalphabets]()
RETURNS @list TABLE (alphabet VARCHAR(10))
BEGIN
DECLARE @num INT=65
WHILE(@num<=90)
BEGIN
INSERT INTO @list SELECT CHAR(@num)
SET @num=@num+1
END
RETURN
END
SELECT * FROM [dbo].[fnalphabets]()
【讨论】:
以上是关于如何使用 UDF Scalar 函数打印字母?的主要内容,如果未能解决你的问题,请参考以下文章
Flink扩展 Table/SQL Scalar 函数实现文档