SQL Serverが2008以降の場合はテーブルに計算インデックスを作成し、SQL Serverが2005以前の場合は単純なインデックスを作成します。
-- check for sql server version
if (select cast(left(cast(serverproperty('productversion') as varchar), 4) as decimal(5, 3))) >= 10
CREATE unique nonclustered index ix1_table
ON table (column1, column2)
WHERE column1 is not null and column2 is not null
ELSE
CREATE nonclustered index ix1_table
ON table (column1, column2)
問題は、ステートメント全体が評価され、SQL Server 2005ではエラーがスローされることです。
キーワード「WHERE」付近の構文が正しくありません。
SQL Serverのバージョンに基づいて、どういうわけか異なるインデックスを作成することは可能ですか?
動的SQLを使用できます
まずバージョンを確認する
次に、nvarchar(max)などの文字列変数を使用してSQLステートメントを作成します。
次に、sp_executeSQLで実行します。
次のスクリプトはこのタスクで機能すると思います
-- check for sql server version
declare @sql nvarchar(max)
if (select cast(left(cast(serverproperty('productversion') as varchar), 4) as decimal(5, 3))) >= 10
set @sql = N'CREATE unique nonclustered index ix1_table ON [table] (column1, column2)
WHERE column1 is not null and column2 is not null'
ELSE
set @sql = N'CREATE nonclustered index ix1_table ON [table] (column1, column2)'
exec sp_executeSQL @sql
ご想像のとおり、アプローチの問題はクエリ構文であり、SQL Serverのバージョンが十分に高くない場合は無効と見なされ、そのコードが実際に実行されない場合でもクエリ全体が拒否されます。
'EXECUTE'(または 'EXEC')コマンドを使用して、このチェックをバイパスできます。
IF <Version Check>
EXECUTE('Index creation command for SQL Server 2008')
ELSE
EXECUTE('Index creation command for SQL Server 2005')
「EXECUTE」ステートメントの引数は、事前に正確性が評価されていません。ステートメントに到達するたびにそのまま実行されます(実行時にエラーが発生する可能性があります)。
完全な情報 ここ 。
もちろん、@@ VERSIONをチェックして、それに基づいて条件付きコードを実行できます。
If @@VERSION like 'Microsoft SQL Server 2008%' THEN
BEGIN
--'stuff here'
END
Caseステートメントとして実行することもできますが、@@ VERSIONはサービスパック情報を返すため、サポートされている機能を確認するだけでTMIを提供している可能性があります。
幸運を!