Sql server SQL Server-varchar值的转换溢出了一个int列

Sql server SQL Server-varchar值的转换溢出了一个int列,sql-server,stored-procedures,type-conversion,Sql Server,Stored Procedures,Type Conversion,我需要生成具有指定长度的随机数字的字符串,因此: ALTER PROCEDURE [dbo].[Generate Account] AS BEGIN DECLARE @accountNumber VARCHAR(36) DECLARE @acc_1 BIGINT DECLARE @acc_2 BIGINT DECLARE @acc_3 BIGINT DECLARE @acc_4 BIGINT -- line 26 DECLARE @acc_5 BI

我需要生成具有指定长度的随机数字的字符串,因此:

ALTER PROCEDURE [dbo].[Generate Account]
AS
BEGIN
    DECLARE @accountNumber VARCHAR(36)
    DECLARE @acc_1 BIGINT
    DECLARE @acc_2 BIGINT
    DECLARE @acc_3 BIGINT
    DECLARE @acc_4 BIGINT -- line 26
    DECLARE @acc_5 BIGINT
    DECLARE @acc_6 BIGINT

    SET @acc_1 = 1000000-ceiling(rand()*100000) + datepart(ms, getdate())
    SET @acc_2 = 1000000-ceiling(rand()*100000) + datepart(ms, getdate())
    SET @acc_3 = 1000000-ceiling(rand()*100000) + datepart(ms, getdate())
    SET @acc_4 = 1000000-ceiling(rand()*100000) + datepart(ms, getdate()) -- line 33
    SET @acc_5 = 1000000-ceiling(rand()*100000) + datepart(ms, getdate())
    SET @acc_6 = 1000000-ceiling(rand()*100000) + datepart(ms, getdate())

    SET @accountNumber = CONVERT(VARCHAR(6), @acc_1) + 
                            CONVERT(VARCHAR(6), @acc_2) + 
                            CONVERT(VARCHAR(6), @acc_3) + 
                            CONVERT(VARCHAR(6), @acc_4) + 
                            CONVERT(VARCHAR(6), @acc_5) + 
                            CONVERT(VARCHAR(6), @acc_6)

    INSERT INTO [dbo].[account] 
    (
        [identifier]
    ) VALUES (
        @accountNumber
    )

    RETURN @accountNumber
END
但我得到了一个错误:

Msg 8152,级别16,状态14,程序生成帐户,第26行[批处理起始行2]
字符串或二进制数据将被截断。
声明已终止

Msg 248,第16级,状态1,程序生成帐户,第33行[批处理起始行2]
varchar值“97654793211591312798738933646998655”的转换溢出了一个int列。
“生成帐户”过程试图返回NULL状态,这是不允许的。将返回0的状态


为什么??我已经将
@acc_X
从INT改为BIGINT,但我仍然收到这个错误…

这里的问题是您的:

RETURN @accountNumber
在SQL Server中,当您试图返回36位的
varchar
时,存储过程只能返回
int
,而SQL Server正在隐式地尝试将其转换为
int

如果需要插入值,请使用简单的select语句替换该行:

SELECT @accountNumber AS AccountNumber

它应该会起作用

如果需要其他选项从存储过程返回/输出值,请查看:


另一个选择是将
[dbo].[Generate Account]
变成一个函数而不是一个过程。作为函数,可以指定返回类型

我建议您的
account
表中的
identifier
列的类型不正确,或者不够宽,无法容纳36位数字。@TimBiegeleisen容纳此值的每一列都是
VARCHAR(36)
问题在于插入的目标列。读取错误消息。默认情况下,如果存储过程成功,则不需要指定它,除非实现特定的逻辑或异常处理。我假设他需要生成的帐号,因为这是随机生成的。@RaulSebastian,默认情况下,存储过程成功时返回0,错误时返回非零。最佳做法是使用返回代码仅表示成功或失败,而不是返回数据;应该使用输出参数或结果集返回数据。默认情况下返回0是正确的,不知道我为什么想到1。至于返回值,这正是我在答案中建议的。
SELECT SCOPE_IDENTITY()