计算SQL中的下一个字母

计算SQL中的下一个字母,sql,sql-server,Sql,Sql Server,表基本上有一个标题列和一个序列列。序列由“aa”、“ab”、“ac”等组成 我试图创建一个函数,给定一个头输入,它给出下一个可能的序列。例如,如果以“a”开头的最后一个序列以“d”(序列“ad”)结尾,则给出“ae”。 首先,我选择当前的“最高”序列(MAX),然后更新第二个字母 我的代码: ALTER FUNCTION [dbo].[fctCalculateNextSeqCode] ( -- Add the parameters for the function here

表基本上有一个标题列和一个序列列。序列由“aa”、“ab”、“ac”等组成

我试图创建一个函数,给定一个头输入,它给出下一个可能的序列。例如,如果以“a”开头的最后一个序列以“d”(序列“ad”)结尾,则给出“ae”。 首先,我选择当前的“最高”序列(MAX),然后更新第二个字母

我的代码:

    ALTER FUNCTION [dbo].[fctCalculateNextSeqCode]
(
    -- Add the parameters for the function here
    @Input nvarchar(50)
)
RETURNS nvarchar
AS
BEGIN

    DECLARE @NewSeq nvarchar(50)
    DECLARE @OldSeq nvarchar(50)

    SET @OldSeq = (select Max(SMTRPD_Sequence) from dbo.TbOrgSM_Transactions_PriceLines_Definition where SMTRPD_Header2 = @Input)

    --first character remains, second character is next in alphabet
    select @NewSeq = LEFT(@OldSeq,1) + CHAR(ASCII(RIGHT(@OldSeq,1))+1);

    -- Return the result of the function
    RETURN @NewSeq

END

当我尝试运行函数时,它只返回序列的第一个字符,而不是第二个字符。我做错了什么?

您应该将
返回值
写为
返回nvarchar(50)
,因为
nvarchar
的默认长度是1个字符

编辑

对于
nchar[(n)]
nvarchar[(n | max)]
当数据定义或变量声明语句中未指定n时,默认长度为1。如果未使用
CAST
函数指定n,则默认长度为30


请查找更多信息

您应该将
返回值
写为
返回nvarchar(50)
,因为
nvarchar
的默认长度为1个字符

编辑

对于
nchar[(n)]
nvarchar[(n | max)]
当数据定义或变量声明语句中未指定n时,默认长度为1。如果未使用
CAST
函数指定n,则默认长度为30



请查找更多信息

实际上,有时默认长度为
30
。有关详细信息,请阅读Aaron Bertrand的文章。@wewewesthemenance当数据定义或变量声明语句中未指定n时,默认长度为1。当不使用CAST函数指定n时,默认长度为30。@Deepshikha,这总是正确的吗?你有支持这一点的参考资料吗?请在这里找到参考资料:@Deepshikha,哈!为什么我没看到?无论如何,谢谢你的链接。实际上,有时候默认长度是
30
。有关详细信息,请阅读Aaron Bertrand的文章。@wewewesthemenance当数据定义或变量声明语句中未指定n时,默认长度为1。当不使用CAST函数指定n时,默认长度为30。@Deepshikha,这总是正确的吗?你有支持这一点的参考资料吗?请在这里找到参考资料:@Deepshikha,哈!为什么我没看到?无论如何,感谢链接。你可能想考虑另一种设计——只存储一个代码> int <代码>值,然后,作为一个格式化步骤(而不必在数据库中完成,但它可能是)。将该数字转换为base-26,其中使用字符
a-z
作为数字。注意类型不匹配:DECLARE@NewSeq nvarchar(50)和…+字符(ASCII(右(@OldSeq,1))+1);您应该使用NCHAR()和UNICODE()而不是CHAR()和ASCII(),为什么要将变量声明为nvarchar(50)?在您的算法中,将始终只处理2个字符。你可以声明为nchar(2)谢谢你的提示,我将改为代码。我的SQL技巧在这一刻并不那么漂亮……你可能想考虑另一种设计——只存储<代码> int <代码>值,然后作为格式化步骤(而不必在数据库中完成,但它可能是)。将该数字转换为base-26,其中使用字符
a-z
作为数字。注意类型不匹配:DECLARE@NewSeq nvarchar(50)和…+字符(ASCII(右(@OldSeq,1))+1);您应该使用NCHAR()和UNICODE()而不是CHAR()和ASCII(),为什么要将变量声明为nvarchar(50)?在您的算法中,将始终只处理2个字符。你可以声明为nchar(2)谢谢你的提示,我将改为代码。我的sql技能现在还不是很好。。。