当在计算列或索引视图上创建和操作索引时,必须将 SET 选项 ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNINGS 设置为 ON。必须将选项 NUMERIC_ROUNDABORT 设置为 OFF。 如果这些选项中的任何一个没有设置为所要求的值,则在索引视图上或在计算列带索引的表上进行的 INSERT、UPDATE 和 DELETE 操作将失败。SQL Server 将发出一个错误,列出所有设置不正确的选项。同时,SQL Server 将在这些表或索引视图上处理 SELECT 语句,仿佛计算列或视图上不存在索引一样。
没有问题啊。 可能Test表有问题? 表结构拿出来看看呢
删除存储过程,然后在查询分析器中执行下述语句创建:SET ARITHABORT ON go create proc p_insertTest ( @fd1 nvarchar(10), @fd2 int, @fd3 int, @id int output ) as begin insert into Test(fd1,fd2,fd3) VALUES(@fd1,@fd2,@fd3) select @id=scope_identity() end
當 SET ARITHABORT 設定為 OFF 時,如果 INSERT、DELETE 或 UPDATE 陳述式在運算式驗算時遇到算數錯誤 (溢位、除以零或值域錯誤),SQL Server 會插入或更新 NULL 值。如果目標資料行並非 NULL,則插入或更新動作會失敗,使用者會收到錯誤。如果 SET ARITHABORT 或是 SET ARITHIGNORE 設定為 OFF 且 SET ANSI_WARNINGS 設定為 ON 時,當 SQL Server 遇到除以零或溢位錯誤時,仍然會傳回錯誤訊息。SET ARITHABORT 的設定是在執行或執行時期設定,而不是在剖析時期設定。
摘自幫助文件 SET ARITHABORT 查詢執行過程中發生溢位或除以零的錯誤時終止查詢。語法 SET ARITHABORT { ON | OFF }備註 如果 SET ARITHABORT 設定為 ON 時,這些錯誤狀況將造成查詢或批次結束。如果錯誤發生於交易中,該交易將復原。如果 SET ARITHABORT 設定為 OFF 且發生這些錯誤時,將顯示警告訊息並將算數運算結果設定為 NULL。附註 如果 SET ARITHABORT 及 SET ARITHIGNORE 都沒有設定時,Microsoft™ SQL Server® 將傳回 NULL,並在查詢執行後傳回警告訊息。 當 SET ARITHABORT 設定為 OFF 時,如果 INSERT、DELETE 或 UPDATE 陳述式在運算式驗算時遇到算數錯誤 (溢位、除以零或值域錯誤),SQL Server 會插入或更新 NULL 值。如果目標資料行並非 NULL,則插入或更新動作會失敗,使用者會收到錯誤。如果 SET ARITHABORT 或是 SET ARITHIGNORE 設定為 OFF 且 SET ANSI_WARNINGS 設定為 ON 時,當 SQL Server 遇到除以零或溢位錯誤時,仍然會傳回錯誤訊息。SET ARITHABORT 的設定是在執行或執行時期設定,而不是在剖析時期設定。建立或操作計算資料行索引或索引檢視表時,SET ARITHABORT 必須設定為 ON。如果 SET ARITHABORT 設定為 OFF,在具有計算資料行索引的資料表或索引檢視表中執行 CREATE、UPDATE、INSERT 及 DELETE 陳述式將發生錯誤。如需更多有關使用索引檢視表和計算資料行索引進行 SET 必要選項設定的詳細資訊,請參閱在 SET 中的〈使用 SET 陳述式的注意事項〉。
如果这些选项中的任何一个没有设置为所要求的值,则在索引视图上或在计算列带索引的表上进行的 INSERT、UPDATE 和 DELETE 操作将失败。SQL Server 将发出一个错误,列出所有设置不正确的选项。同时,SQL Server 将在这些表或索引视图上处理 SELECT 语句,仿佛计算列或视图上不存在索引一样。
可能Test表有问题?
表结构拿出来看看呢
go
create proc p_insertTest
(
@fd1 nvarchar(10),
@fd2 int,
@fd3 int,
@id int output
)
as
begin
insert into Test(fd1,fd2,fd3) VALUES(@fd1,@fd2,@fd3)
select @id=scope_identity()
end
我希望的是这个存储过程不论外部的环境设置怎样都可以执行成功,
但是存储过程内部的SET好像并没有起到作用?
在exec p_insertTest 'aaaaabbb',0,1,@ID output前有SET ARITHABORT OFF就会出错,没有就不会出错,也就是说p_insertTest体内的SET ARITHABORT ON这句没有起到它应该的作用。这是为什么?
SET ARITHABORT
查詢執行過程中發生溢位或除以零的錯誤時終止查詢。語法
SET ARITHABORT { ON | OFF }備註
如果 SET ARITHABORT 設定為 ON 時,這些錯誤狀況將造成查詢或批次結束。如果錯誤發生於交易中,該交易將復原。如果 SET ARITHABORT 設定為 OFF 且發生這些錯誤時,將顯示警告訊息並將算數運算結果設定為 NULL。附註 如果 SET ARITHABORT 及 SET ARITHIGNORE 都沒有設定時,Microsoft™ SQL Server® 將傳回 NULL,並在查詢執行後傳回警告訊息。
當 SET ARITHABORT 設定為 OFF 時,如果 INSERT、DELETE 或 UPDATE 陳述式在運算式驗算時遇到算數錯誤 (溢位、除以零或值域錯誤),SQL Server 會插入或更新 NULL 值。如果目標資料行並非 NULL,則插入或更新動作會失敗,使用者會收到錯誤。如果 SET ARITHABORT 或是 SET ARITHIGNORE 設定為 OFF 且 SET ANSI_WARNINGS 設定為 ON 時,當 SQL Server 遇到除以零或溢位錯誤時,仍然會傳回錯誤訊息。SET ARITHABORT 的設定是在執行或執行時期設定,而不是在剖析時期設定。建立或操作計算資料行索引或索引檢視表時,SET ARITHABORT 必須設定為 ON。如果 SET ARITHABORT 設定為 OFF,在具有計算資料行索引的資料表或索引檢視表中執行 CREATE、UPDATE、INSERT 及 DELETE 陳述式將發生錯誤。如需更多有關使用索引檢視表和計算資料行索引進行 SET 必要選項設定的詳細資訊,請參閱在 SET 中的〈使用 SET 陳述式的注意事項〉。