当我没有定义任何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出现的存储过程的完整代码。
答案 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在评论中指出的那样,问题是我在数据库上有一个激活的触发器,即将数据复制到一个整数列中。
因此,如果您遇到同样的问题:检查数据库上的触发器!