Nvarchar值溢出int列没有int列?

时间:2017-03-30 12:31:15

标签: sql sql-server sql-server-2012

当我没有定义任何int值时,我的nvarchar值如何溢出int列?

运行存储过程时出现以下错误:

EXECUTE [dbo].[updateUser] @status = 'active', ..... ,@srcID = '17191925814'

我试图执行的陈述:

CREATE PROCEDURE [dbo].[updateUser] ... , @srcID nvarchar(255), ...

问题是我从未将该值定义为int。据我所知,它总是作为字符串处理。在我的存储过程中,@ srcID参数定义为nvarchar(255):

IF @srcID NOT IN ('', '0') AND @srcID IS NOT NULL
    UPDATE [dbo].[Users] SET [Source System ID] = @srcID WHERE ...
ELSE IF @srcID = '0'
    UPDATE [dbo].[Users] SET [Source System ID] = '' WHERE ...

在该存储过程中,我尝试更新列中的值,该列也定义为nvarchar(255):

CREATE TABLE [dbo].[Users] ( ..., [Source System ID] [nvarchar](255) NULL, ...)

目标表:

putextra

SQL Server试图转换的地点或原因为' 17191925814'到一个int,我怎么能阻止它?

编辑:我已经包含参数@srcID出现的存储过程的完整代码。

2 个答案:

答案 0 :(得分:2)

这不是特定的答案(我同意Gordon,Zohar和Damien),但应该很难在评论中写下来。 按照“减少”程序来显示案例。 我希望它可以帮助你作为一种方法,当你有类似的问题(总是试图缩小范围),并作为戈登,佐哈尔和其他人的确认(我知道,没有必要确认,因为他们有很高的声誉:-)已经说过了:

CREATE TABLE X ( SourceSystemID nvarchar(255) NULL);
INSERT INTO X VALUES ('17191925814');
GO
CREATE PROCEDURE Upd_X @srcID NVARCHAR(255)
AS
BEGIN
IF @srcID NOT IN ('', '0') AND @srcID IS NOT NULL    UPDATE X SET SourceSystemID = @srcID  
ELSE IF @srcID = '0' UPDATE X SET SourceSystemID = '' 
END
;
GO
SELECT * FROM X
EXEC Upd_X '17191925814';
SELECT * FROM X;

输出:

SourceSystemID
---------------
17191925814


SourceSystemID
-----------------------------------------
17191925814

答案 1 :(得分:1)

正如Damian在评论中指出的那样,问题是我在数据库上有一个激活的触发器,即将数据复制到一个整数列中。

因此,如果您遇到同样的问题:检查数据库上的触发器!