SQL Server2012。基于存储过程的变量长度;输入值将自动修剪并插入到表格中。
示例:我正在传递变量@name varchar(10)
:
@name VARCHAR(10) = null
但是,在通过存储过程插入超过10个字符的记录时,通过将字符修整为前10位来插入记录。
我期望得到错误异常,例如
字符串或二进制数据将被截断
如何从存储过程中引发异常错误?
CREATE TABLE tbl_test
(
[ID] INT,
[NAME] VARCHAR(10),
)
GO
CREATE PROCEDURE usp_test
(@name VARCHAR(10) = NULL)
AS
SET ANSI_WARNINGS ON
BEGIN
INSERT INTO tbl_test
VALUES (1, @name)
INSERT INTO tbl_test([ID], [NAME])
VALUES (2, @name)
END
答案 0 :(得分:3)
行为取决于ANSI_WARNINGS
session setting。
使用ANSI_WARNINGS ON
(现代Microsoft SQL Server API中的默认值),当将数据插入较短长度的列中时,将出现预期的“字符串或二进制数据将被截断”错误。 ANSI_WARNINGS ON
由ANSI_DEFAULTS ON
隐式设置。
使用ANSI_WARNINGS OFF
,数据将被静默截断。
但是,当传递的参数值长于定义的参数长度时,无论会话设置如何,该值都会被截断而不会出现错误或警告。 documented behavior可能不是人们所期望的:
在SET ANSI_WARNINGS中传递参数时 过程,用户定义的功能或声明和设置时 批处理语句中的变量。例如,如果定义了变量 作为char(3),然后设置为大于三个字符的值, 数据将被截断为定义的大小,并进行INSERT或UPDATE 语句成功。
因此确保提供的值不超过定义的参数长度很重要。
答案 1 :(得分:0)
一种可行的方法是确保您的参数长于表列。不必长得多-一个字符就足够了。然后,如果您传递了一个更长的字符串,则在存储过程中它仍然会更长。
这时,您可以测试长度是否太长并引发自己的错误,或者如果尝试将其放在表中,无论如何都会出现错误。无论哪种方式,至少您都会知道。