SQL Server 2000 から以降のバージョンにデータベースをアップグレードした後、アプリケーションでエラーが発生する場合がある


現象


次のような状況で問題が発生します。

  • SQL Server 2000 データベースで、特別な既定値を持つように構成されている、テーブル内の列がある。
  • このデータベースを以降のバージョンの SQL Server (SQL Server 2005、SQL Server 2008 または SQL Server 2008 R2 のいずれか) にアップグレードする。

この場合、アップグレード後のバージョンでは、列の既定値にはその前後に追加のかっこがあり、また SQL Server 2000 の元の既定値を受け付けるようにコーディングされたアプリケーションでエラーが発生します。

次の表に、SQL Server のさまざまなバージョンがカタログ メタデータのテーブルに既定値 0 を格納する方法を示します。
バージョンSQL Server 2000SQL Server 2005 以降
(0)((0))

注: この問題は数値のみに影響します。SQL Server 2000 と新しいバージョンの両方で、テキストと関数は同じ形式で格納されます。
たとえば、text は (‘text’) として格納され、function() は (function()) として格納されます。

原因


この動作は仕様です。カタログ メタデータで SQL 式をデコードおよび格納する方法においては、新しいバージョンの SQL Server は SQL Server 2000 と異なります。関連情報については、この資料の「詳細」に記載されているさまざまなリンクを参照してください。

解決方法


新しい形式で既定値を受け付けるように、アプリケーションを修正します。たとえば、アプリケーションが、数値の前後に 1 セットのかっこがある "(0)" が既定値であると想定するように設計されている場合、SQL Server 2005 以降のバージョンのデータベースで引き続き動作するように、2 セットのかっこ "((0))" を想定するようにアプリケーションを変更します。

詳細


列の既定値を表示する方法: 以下の 2 つの方法のいずれかを使用すると、列に対して現在構成されている既定値を表示することができます。

方法 1: SQL Server Management Studio を使用する:
  1. オブジェクト エクスプローラーで、既定値を確認する列が含まれるテーブルを右クリックし、[デザイン] をクリックしてテーブル デザイナーでテーブルを開きます。
  2. 既定値を確認する列を選択します。
  3. [列のプロパティ] タブで、以下の図に示す "既定値またはバインド" プロパティで既定値を確認します。
SQL Server Management Studio の


方法 2: 以下のいずれかのシステム ビューを使用します。

  • sys.default_constraints - "Definition" 列を使用して必要な情報を取得します。
  • sys.syscomments - このビューの "Text" 列を使用して必要な情報を取得します。
    注: この SQL Server 2000 のシステム テーブルは、下位互換性のためのビューとして追加されています。代わりに、最新の SQL Server のシステム ビューを使用することをお勧めします。同等のシステム ビューまたはビューについては、下記の「関連情報」のリンクを参照してください。
関連情報