- PR -

SQLServer2000 計算列のIndexについて

1
投稿者投稿内容
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-11-07 13:46
お世話になっております。

開発環境
WindowsXPPro
SQLServer2000
VS2003 VB.NET

SQLServer2000において、
テーブル

Create TableA(
[Code] [decimal](8, 0) NOT NULL ,
[calc_親Code] AS (floor(([Code] / 1000)))
) ON [PRIMARY]

を作成(実際はもっと列があるのですが簡略化しています)し、

このテーブルの計算列にIndexを
以下のように作成しました。

SET ARITHABORT ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
SET ANSI_PADDING ON
GO
SET ANSI_WARNINGS ON
GO
SET NUMERIC_ROUNDABORT OFF
GO

CREATE INDEX [IX_Calc] ON [dbo].[TableA]([calc_親Code]) ON [PRIMARY]

set arithabort OFF
GO
set numeric_roundabort OFF
GO
set quoted_identifier OFF
GO
SET ANSI_NULLS ON
GO


Deleteのみを行うストアドプロシージャ

SET ARITHABORT ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
SET ANSI_PADDING ON
GO
SET ANSI_WARNINGS ON
GO
SET NUMERIC_ROUNDABORT OFF
GO
CREATE PROCEDURE Proc_Delete
@DelCode as decimal
AS
BEGIN
Delete from TableA Where Code=@DelCode
END

set arithabort OFF
GO
set numeric_roundabort OFF
GO
set quoted_identifier OFF
GO
SET ANSI_NULLS ON
GO

を作成し、

VS2003のSQLCommandでこのストアドを実行すると、
SQLエラーとなり以下のようなメッセージが返されます。
『DELETE に失敗しました。次の SET オプションが無効な設定を持っています: 'ARITHABORT'』
同様にInsert・UpDateでもエラーとなります。

上記エラーとならないようにはどのようにすればよいのでしょうか?
ご教授よろしく御願い申し上げます。












かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-11-07 17:01
CREATE PROCEDUREの内側、deleteの前で SET ARITHABORT ON してみてはいかがでしょうか。
そら豆
常連さん
会議室デビュー日: 2007/05/10
投稿数: 21
投稿日時: 2007-11-07 17:37
かめたろ様
ご回答ありがとう御座います。

CREATE PROCEDUREの内側、deleteの前で SET ARITHABORT ON

を試してみましたが、やはり同様のエラーとなってしまいました。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2007-11-08 11:17
失礼しました。試してみてうまくいかないことを確認しました。ストアドの中でオプションを設定すれば有効になると思っていたのですが、そうではないオプションもあるようですね。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_set-set_40c4.asp
こちらを見る限りでは、ARITHABORTもストアド内で設定可能かなと思ったのですが・・・。

サーバレベル、データベースレベルまたはコネクションレベルの任意のレベルでARITHABORTをONに設定する必要があるようです。

一応、SqlClientを使用してコネクションレベルでのARITHABORTの設定を試しましたのでコードを載せておきます。
コード:
        Dim con As New SqlClient.SqlConnection
        con.ConnectionString = "server=xxx;uid=xx;password=xx;database=kame"
        con.Open()

        Dim cmd As New SqlClient.SqlCommand
        cmd.Connection = con

        cmd.CommandText = "SET ARITHABORT ON"
        cmd.CommandType = CommandType.Text
        cmd.ExecuteNonQuery()

        cmd.CommandText = "ARITHABORT_TEST"
        cmd.CommandType = CommandType.StoredProcedure
        cmd.ExecuteNonQuery()

1

スキルアップ/キャリアアップ(JOB@IT)