gpt4 book ai didi

sql-server - 为什么在 sql server 2005 中使用 xml 时必须 SET ARITHABORT ON?

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:13 29 4
gpt4 key购买 nike

为什么在 sql server 2005 中使用 xml 时必须 SET ARITHABORT ON?我试着研究为什么我必须设置这个但找不到告诉我原因的答案。只是需要设置。

这是我在删除 SET ARITHABORT ON 行时收到的具体错误消息:

PARAMETER ERROR: INSERT LIST COULD NOT BE PARSED - INSERT failed because the following SET options have incorrect settings: 'ARITHABORT'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or query notifications and/or xml data type methods.

我的存储过程在一个环境中使用 odbc 从 asp.net 调用时运行良好。然后,当我将它移动到另一个时,我必须在存储过程的开头添加 SET ARITHABORT ON。我在下面包含了存储过程的相关部分。以及调用它的代码。

CREATE PROCEDURE [dbo].[myproc]
@ruserid varchar(8),
@folder_list xml,
@insert_list xml
AS

SET NOCOUNT ON
SET ARITHABORT ON

DECLARE @rindex integer
DECLARE @errormsg nvarchar(4000)
DECLARE @folder_cnt integer
DECLARE @insert_cnt integer


SET @rindex = -1

-- temp table to hold inserts
CREATE TABLE #insert_list (rowidx integer IDENTITY(1,1), insertdesc varchar(96) COLLATE database_default, insertfolder integer)

-- temp table to hold folders
CREATE TABLE #folder_list (rowidx integer IDENTITY(1,1), folderdesc varchar(144) COLLATE database_default, insertfolder integer)

-- insert inserts to make sure data is compatible in type
BEGIN TRY
INSERT INTO #insert_list (insertdesc, insertfolder)
SELECT insert_list.listitem.value('@insertdesc', 'varchar(96)'), insert_list.listitem.value('@insertfolder', 'integer')
FROM @insert_list.nodes('/Root/Insert') AS insert_list(listitem)
END TRY
BEGIN CATCH
SET @errormsg = N'PARAMETER ERROR: INSERT LIST COULD NOT BE PARSED - ' + ERROR_MESSAGE()
RAISERROR(@errormsg, 16, 1)
RETURN
END CATCH

-- insert folders to make sure data is compatible in type
BEGIN TRY
INSERT INTO #folder_list (insertfolder, folderdesc)
SELECT folder_list.listitem.value('@insertfolder', 'integer'), folder_list.listitem.value('@folderdesc', 'varchar(144)')
FROM @folder_list.nodes('/Root/Folder') AS folder_list(listitem)
END TRY
BEGIN CATCH
SET @errormsg = N'PARAMETER ERROR: FOLDER LIST COULD NOT BE PARSED - ' + ERROR_MESSAGE()
RAISERROR(@errormsg, 16, 1)
RETURN
END CATCH

-- insert rows
BEGIN TRANSACTION

BEGIN TRY

INSERT INTO my_folder_request (ruserid)
VALUES ( @ruserid )

SET @rindex = SCOPE_IDENTITY()

INSERT INTO my_insert_request (rindex, insertdesc, insertfolder)
SELECT @rindex, #insert_list.insertdesc, #insert_list.insertfolder
FROM #insert_list
ORDER BY #insert_list.rowidx

INSERT INTO my_folder_desc (rindex, insertfolder, folderdesc)
SELECT @rindex, #folder_list.insertfolder, #folder_list.folderdesc
FROM #folder_list
ORDER BY #folder_list.rowidx

END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
SET @errormsg = N'DATA INSERTION FAILED WITH MESSAGE - ' + ERROR_MESSAGE()
RAISERROR(@errormsg, 16, 1)
RETURN
END CATCH

IF @@TRANCOUNT > 0
COMMIT TRANSACTION

-- return result
SELECT @rindex AS rindex

DROP TABLE #insert_list
DROP TABLE #folder_list

GO

调用代码

  ' build odbc command for inserting creation request
intRequestIndex = 0
cmdAddRequest = New System.Data.Odbc.OdbcCommand
cmdAddRequest.CommandType = CommandType.StoredProcedure
cmdAddRequest.CommandTimeout = 60
cmdAddRequest.CommandText = "{CALL myproc ( ?, ?, ?)}"

' add parameters to odbc command
cmdAddRequest.Parameters.Add("@ruserid", OdbcType.VarChar, 8).Value = SafeODBCParamString(m_strUID)
cmdAddRequest.Parameters.Add("@folder_list", OdbcType.NText).Value = System.Text.Encoding.Unicode.GetString(strmFolderList.ToArray())
cmdAddRequest.Parameters.Add("@insert_list", OdbcType.NText).Value = System.Text.Encoding.Unicode.GetString(strmInsertList.ToArray())

' run odbc command returning info about results
cmdAddRequest.Connection = Me.ODBCConnection()
Try
rdrRequestData = cmdAddRequest.ExecuteReader(CommandBehavior.CloseConnection)

最佳答案

这是我在从 .Net 客户端调用带有 xml 输入参数的存储过程时发现的 ARITHABORT 问题的解决方案。

using (var conn = new SqlConnection(dbConnectionString))  
{
SqlCommand command = new SqlCommand("[stored procedure name here]", conn);
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@parameter_name", parameter_xml_value);

conn.Open();

SqlCommand arithabortCommand = new SqlCommand("SET ARITHABORT ON", conn);
arithabortCommand.ExecuteNonQuery();

command.ExecuteNonQuery();
conn.Close();
} // using (var conn = new SqlConnection(dbConnectionString))

关于sql-server - 为什么在 sql server 2005 中使用 xml 时必须 SET ARITHABORT ON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1100098/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com