2009-04-07 17 views
107

私は私のスクリプト内のいくつかの場所でデータベース名を使用して、私はすぐにそれを変更することができるようにしたいので、私はこのような何かを探しています:T-SQLのデータベース名に変数を使用する方法は?

DECLARE @DBNAME VARCHAR(50) 
SET @DBNAME = 'TEST' 

CREATE DATABASE @DBNAME 
GO 
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90 
GO 
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO 

しかし、それは動作しません。では、このコードを書く正しい方法は何ですか?

+0

動的SQL ..... –

答えて

114

{SERVERNAME}のプレースホルダを使用して、スクリプト全体をテンプレート文字列に置きます。次に、使用して文字列を編集します。

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME) 

をして、それが3年の過程で、誰も私のコードがないことに気づいていない、と信じることは難しい

EXECUTE (@SQL_SCRIPT) 

でそれを実行します仕事

EXEC複数のバッチは使用できません。 GOはバッチ区切りであり、T-SQL文ではありません。 3つの別々の文字列を作成し、置換後にそれぞれEXECにする必要があります。

GOで分割して1つのテンプレート文字列を複数の行に分割することで、 "巧妙な"ことができます。私はADO.NETコードでそれをやった。

「SERVERNAME」という単語はどこから入手できましたか?

は、ここで私はちょうどテスト(と働く)いくつかのコードです:

DECLARE @DBNAME VARCHAR(255) 
SET @DBNAME = 'TestDB' 

DECLARE @CREATE_TEMPLATE VARCHAR(MAX) 
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX) 
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX) 

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}' 
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90' 
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE' 

DECLARE @SQL_SCRIPT VARCHAR(MAX) 

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME) 
EXECUTE (@SQL_SCRIPT) 

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME) 
EXECUTE (@SQL_SCRIPT) 

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME) 
EXECUTE (@SQL_SCRIPT) 
+2

+1非常に良いアプローチ...ちょっとした仕事から私を救ったのですが、それはEXECUTE(@SQL_SCRIPT)でなければなりませんが、少なくともそれは私のために働いたものです。 – reSPAWNed

+2

しかし、エスケープには注意が必要です。 – usr

+4

'SYSNAME'は' VARCHAR(255) 'よりも適切なデータ型になります。また、可能なすべてのデータベース名を扱うために' QUOTENAME'を使うべきです(そして、おそらく名前のソースに応じてSQLインジェクションを防ぐために)。 –

5

create table文で変数を使用することはできません。私が提案することができる最も良いことは、クエリ全体を文字列とexecで書くことです。

declare @query varchar(max); 
set @query = 'create database TEST...'; 

exec (@query); 
9

残念ながら、あなたがその形式の変数でデータベース名を宣言することはできません。

はこのような何かを試してみてください。

あなたが達成しようとしていることについては、EXEC()ステートメント内でステートメントをラップする必要があります。だからあなたのようなものがあるだろう:

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME 

をして、SQL文字列を実行するために

EXECUTE(@Sql) or sp_executesql(@Sql) 

を呼び出します。

+0

'EXEC'はストアドプロシージャを探します。この場合、 'EXECUTE'が必要です。 –

+0

ありがとう@BobBlogge - 私はそれを更新しました。 –

+2

実際に私は謝罪する必要があります。 'EXEC'と' EXECUTE'は同じものです。私は 'EXEC'で失敗し、' EXECUTE'で成功した後にステートメントを作成しました。明らかに私の本当の問題はどちらかとは無関係でした。 –

90

また、(Management Studioの「クエリ」メニューでこれを有効にする)このためsqlcmdモードを使用することができます。

:setvar dbname "TEST" 

CREATE DATABASE $(dbname) 
GO 
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90 
GO 
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE 
GO 

EDIT:

SQLCMDツールを使用してパラメータを設定するには、このMSDN記事をチェックしてください。

+0

このメソッドはすでに宣言された変数をどのように使用できますか? "TEST"の代わりに@dbNameを追加できますか?私は試して、働かなかった – syclee

+1

@syclee TSQL変数?スクリプトがサーバーに送信される前にsqlcmdの置換が実行されることはありません。 –

+0

@MartinSmithねえ、OUTPUTコマンドとしてdb名が必要です。だから、どうすればSQLCMDを使うことができますか? –

関連する問題