2011-12-21 16 views
2

これは以前には登場しなかったのに驚いていますが、ここや他の場所の検索で何も見つかりませんでした。ぼんやりと似たようなものが見つかりました。これは、スクリプト内のUseコマンドがその1行だけ持続するという問題を示していますが、その回避方法の兆候はありませんでした。変数を使用してスキーマを作成するスクリプト

私がやろうとしていること:一般的なスクリプトを作成して、私の一般的なスキーマとテーブルを持つ「テンプレート」データベースを作成します。すべての変数(データベース名など)は、必要に応じて変更できるようにヘッダーに設定されています。また、危険な検索や操作を置き換えることなく、ハードコードされた値を変更することなくスクリプトを実行できます。

問題点:正しいデータベースで生成するスキーマを取得できません。彼らはすべてマスターで生成しています。明示的にデータベースを設定しようとしたが役に立たなかった。私はちょうどランタイムエラーを受け取った。

私のスキルレベル:長時間ユーザにアクセスしても、SQL Serverの探索の谷間にいます。私は確かに(これは願っていますが)これは、誰かが坂を上っていくと、これはばかげて簡単になるでしょう。

誰かが私のように何かできるか知っていますか? (既存のコードは以下のようになります。)

DECLARE @DBName NVARCHAR(50) = 'TheDBName'; 

-- Assume that there's a bunch of code to drop and create the database goes here. 
-- This code executes correctly. 

SET @SQL = 'Use [' + @DBName + ']'; 

Print @SQL; 

EXEC(@SQL); 

SET @Counter = 1; 

WHILE @Counter <=3 

    BEGIN 
     SET @SQL = 'CREATE SCHEMA [' + 
     CASE @Counter 
      WHEN 1 THEN 'Schema1' 
      WHEN 2 THEN 'Schema2' 
      WHEN 3 THEN 'Schema3' 
     END 

     SET @SQL = @SQL + '] AUTHORIZATION [dbo]'; 

     PRINT 'Creating Schemas, ' + @SQL; 

     Exec(@SQL); 

    SET @Counter = @Counter + 1;  
END 

答えて

4

useコマンドは現在のスコープ内の現在のdbのみを変更し、動的SQLはそれ自身のスコープで実行します。

master

declare @SQL nvarchar(max) 
set @SQL = N'use tempdb; print db_name()' 
exec(@SQL) 
print db_name() 

結果から、これを試してみてください:

tempdb 
master 

はこのお試しください:、

DECLARE @DBName NVARCHAR(50) = 'TheDBName'; 
DECLARE @SQL NVARCHAR(max) 
DECLARE @SQLMain NVARCHAR(max) 
DECLARE @Counter int 

SET @SQLMain = 'Use [' + @DBName + ']; exec(@SQL)'; 


SET @Counter = 1; 

WHILE @Counter <=3 
BEGIN 
    SET @SQL = 'CREATE SCHEMA [' + 
     CASE @Counter 
      WHEN 1 THEN 'Schema1' 
      WHEN 2 THEN 'Schema2' 
      WHEN 3 THEN 'Schema3' 
     END 

    SET @SQL = @SQL + '] AUTHORIZATION [dbo]'; 

    EXEC sp_executesql @SQLMain, N'@SQL nvarchar(max)', @SQL; 

    SET @Counter = @Counter + 1; 
END 
+1

応答する時間をとってくれてありがとう、私にはうまくいかない恐れがあります。この行はUse [MYDBTEMPLATE];と出力されます。 CREATE SCHEMA [SCHEMA1] AUTHORIZATION [dbo]これは、 'CREATE SCHEMA'がクエリバッチの最初の文でなければならないというエラーを生成しました。 –

+1

@AlanK - もちろんです。それを考えなかった。 –

+0

しかし、改訂されたコードはすごくうまくいった!ありがとう、ありがとう、ダ男! –

0

を使用すると、EXEC内のUSE文を実行した場合は()、あなたはUSE databasename STMTを使用する必要が

しかし

)(EXECでも他のステートメントを実行します。

+0

ありがとうOleg;私はそれがミカエルが示していたものだと思っていますが、私は最初の声明でなければならないという問題を抱えています(私は最初の投稿で言及して忘れてしまいました)。 –

0

他の答えはあなたの当面の問題を説明したが、これは本当に展開の問題ですので、一般的な解決策として、using SQLCMD variables実行時にコマンドラインから設定することができます。これにより、データベース名やスキーマ名をスクリプトに動的に渡すことができるため、バッチファイルやVSデータベースプロジェクトを使用して配置を自動化することができます。

+0

ありがとうございました。私は関連するヘルプファイルを見てきました。これは将来的には有用かもしれません。 –

関連する問題