web-dev-qa-db-ja.com

SQL Serverのバージョンに基づいてSQLステートメントを実行する方法はありますか?

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のバージョンに基づいて、どういうわけか異なるインデックスを作成することは可能ですか?

4
Dragan Matic

動的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
6
kodyaz

ご想像のとおり、アプローチの問題はクエリ構文であり、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」ステートメントの引数は、事前に正確性が評価されていません。ステートメントに到達するたびにそのまま実行されます(実行時にエラーが発生する可能性があります)。

完全な情報 ここ

4
Massimo

もちろん、@@ VERSIONをチェックして、それに基づいて条件付きコードを実行できます。

If @@VERSION like 'Microsoft SQL Server 2008%' THEN
BEGIN
--'stuff here'
END

Caseステートメントとして実行することもできますが、@@ VERSIONはサービスパック情報を返すため、サポートされている機能を確認するだけでTMIを提供している可能性があります。

幸運を!

1