首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server varchar值的转换溢出int列

Server varchar值的转换溢出int列
EN

Stack Overflow用户
提问于 2018-01-21 11:29:57
回答 2查看 4.2K关注 0票数 2

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

代码语言:javascript
复制
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值'976547932115913127987338933646998655‘的转换溢出一个int列。 “Generate”过程试图返回NULL状态,这是不允许的。将返回0的状态。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-21 12:07:08

这里的问题是:

代码语言:javascript
复制
RETURN @accountNumber

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

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

代码语言:javascript
复制
SELECT @accountNumber AS AccountNumber

代码语言:javascript
复制
SELECT SCOPE_IDENTITY()

而且它应该能工作。

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

从存储过程返回数据

票数 3
EN

Stack Overflow用户

发布于 2018-01-21 19:08:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48366286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档