sql-server - SQL Server - varchar 值的转换溢出了 int 列

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

但我收到错误:

Msg 8152, Level 16, State 14, Procedure Generate Account, Line 26 [Batch Start Line 2]
String or binary data would be truncated.
The statement has been terminated.

Msg 248, Level 16, State 1, Procedure Generate Account, Line 33 [Batch Start Line 2]
The conversion of the varchar value '976547932115913127987338933646998655' overflowed an int column.
The 'Generate Account' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

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

最佳答案

这里的问题是你的:

RETURN @accountNumber

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

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

SELECT @accountNumber AS AccountNumber

SELECT SCOPE_IDENTITY()

它应该可以工作。

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

return data from a stored procedure

关于sql-server - SQL Server - varchar 值的转换溢出了 int 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366286/

相关文章:

SQL IsNumeric 返回 True,但 SQL 报告 'Conversion Failed'

sql - SQL Server 中 session 和连接的区别

sql - 只从数据库中获取我想要的数据但保留结构

c# - 我需要帮助使用 C# 使用 MySql.Data、MySql.Data.MySqlClient 从文件执行 MySQL 脚本

c# - c# asp.net 中的 SQL raiserror 输出

r - 将数字转换为日期

c# - Entity Framework 未从 SQL Server 存储过程中获取空间类型数据

如果参数为空,SQL 将忽略 WHERE 的一部分

android - 如何从 byte[] 创建 Drawable ? (安卓)

go - 如何将十六进制转换为 float