1. ホーム
  2. sql-server

[解決済み] T-SQLでデータベース名に変数を使用するには?

2022-07-11 23:21:52

質問

データベース名をスクリプトの何箇所かで使っているのですが、すぐに変更できるようにしたいので、以下のようなものを探しています。

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

しかし、これではうまくいきません。では、このコードの正しい書き方は何でしょうか?

どのように解決するのですか?

スクリプト全体をテンプレート文字列に入れ、{SERVERNAME}プレースホルダーを付けます。そして、その文字列を編集してください。

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

で実行し

EXECUTE (@SQL_SCRIPT)


信じられないことですが、3 年間の間に、誰も私のコード は機能しない !

あなたは EXEC を複数のバッチにすることができます。 GO はバッチセパレータであり、T-SQLステートメントではありません。3つの別々の文字列を構築する必要があり、その後に EXEC をそれぞれ代入する必要があります。

で分割して、単一のテンプレート文字列を複数の行に分割することで、何かquot;clever"を行うことができると思います。 GO 私は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)