我应该如何从存储过程中抛出异常错误,例如“字符串或二进制数据将被截断。”?

时间:2018-06-24 21:41:49

标签: sql sql-server

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

2 个答案:

答案 0 :(得分:3)

行为取决于ANSI_WARNINGS session setting

使用ANSI_WARNINGS ON(现代Microsoft SQL Server API中的默认值),当将数据插入较短长度的列中时,将出现预期的“字符串或二进制数据将被截断”错误。 ANSI_WARNINGS ONANSI_DEFAULTS ON隐式设置。

使用ANSI_WARNINGS OFF,数据将被静默截断。

但是,当传递的参数值长于定义的参数长度时,无论会话设置如何,该值都会被截断而不会出现错误或警告。 documented behavior可能不是人们所期望的:

  在

SET ANSI_WARNINGS中传递参数时   过程,用户定义的功能或声明和设置时   批处理语句中的变量。例如,如果定义了变量   作为char(3),然后设置为大于三个字符的值,   数据将被截断为定义的大小,并进行INSERT或UPDATE   语句成功。

因此确保提供的值不超过定义的参数长度很重要。

答案 1 :(得分:0)

一种可行的方法是确保您的参数长于表列。不必长得多-一个字符就足够了。然后,如果您传递了一个更长的字符串,则在存储过程中它仍然会更长。

这时,您可以测试长度是否太长并引发自己的错误,或者如果尝试将其放在表中,无论如何都会出现错误。无论哪种方式,至少您都会知道。