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

时间:2018-01-21 11:29:58

标签: 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 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

但我收到错误:

  

消息8152,级别16,状态14,过程生成帐户,第26行[批次启动第2行]
  字符串或二进制数据将被截断   该语句已终止。

     

消息248,级别16,状态1,过程生成帐户,第33行[批次启动第2行]
  varchar值的转换' 976547932115913127987338933646998655'溢出一个int列。
  '生成帐户'过程尝试返回NULL状态,这是不允许的。将返回状态0。

为什么呢?我已经将@acc_X从INT更改为BIGINT但我仍然收到此错误...

2 个答案:

答案 0 :(得分:3)

这里的问题是你的:

print

在SQL Server中,存储过程只能在您尝试返回36位RETURN @accountNumber 时返回int,并且SQL Server隐式尝试将其转换为varchar

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

int

SELECT @accountNumber AS AccountNumber

它应该有用。

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

return data from a stored procedure

答案 1 :(得分:0)

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