2016-10-27 19 views
2

を働いていない表 "[DB]を使用する"動的SQL私は、データベースを作成するために、動的SQLを使用

は、これは、SQLスクリプト

DECLARE @DatabaseName VARCHAR(50) = N'test'; 
EXECUTE ('CREATE DATABASE [' [email protected]+']'); 
EXECUTE('USE ' + @DatabaseName) 
GO 
CREATE SCHEMA [Framework] 
GO 

私は

Msg 2714, Level 16, State 6, Line 1 
There is already an object named 'Framework' in the database. 
Msg 2759, Level 16, State 0, Line 1 
CREATE SCHEMA failed due to previous errors 

を取得エラーです。

このエラーEXECUTE( 'を使用' + @DatabaseName)

が動作していないので、私は

SET @SQL02 = 'USE ['+ convert(nvarchar(50),@DatabaseName) +']; SELECT DB_NAME();' 
exec sp_executesql @SQL02 

ではなく、私は何ができるか

仕事を使用しようか?

+0

使用しているdbmsにタグを付けます。 (おそらくSQLサーバー?) – jarlh

+0

私はSQLのバージョン2012を使用しました – Jala

+2

独自のインスタンスで実行を実行します。 'USE 'が正しく動作するためには、同じEXECUTEコマンドですべてのアクションを実行する必要があります。 – Jens

答えて

2
DECLARE @Query VARCHAR(200); 
SET @Query = CONCAT('USE ', QUOTENAME('<MyDatabase>'), '; ', 'select DB_NAME();'); 

EXECUTE (@Query); 

これは、限り、あなたは1 EXECUTE内に残るよう<MyDatabase>戻ります。

1

これを試してみてください:(あなたが実行を使用する場合、DBコンテキストはそれが唯一の実行のみのために変更されます)

DECLARE @DatabaseName VARCHAR(50) = N'test'; 
EXECUTE ('CREATE DATABASE [' [email protected]+']'); 
use [test] 
go 
CREATE SCHEMA [Framework] 
GO 
2

私はリモート実行のためにこのフォームを好む:

declare @sql nvarchar(max) = N'select Db_Name()'; 

<DatabaseName>.sys.sp_executesql @sql; 

あなたはこれを置くことができますストアドプロシージャを作成することにより、より便利な形式にロジックを変換することができます。

create procedure dbo.usp_ExecuteSqlCommand (
    @databaseName sysname 
    , @sqlCommand nvarchar(max) 
) 
as 
begin; 
    set nocount on; 
    set xact_abort on; 

    declare @innerStatement nvarchar(max) = @sqlCommand; 
    declare @outerStatement nvarchar(max); 

    set @databaseName = QuoteName(ParseName(@databaseName, 1), N'['); 
    set @outerStatement = @databaseName + N'.sys.sp_executesql @stmt = @innerStatement;'; 

    execute sys.sp_executesql 
     @stmt = @outerStatement 
     , @params = N'@innerStatement nvarchar(max)' 
     , @innerStatement = @innerStatement; 
end; 

使い方は明らかです。

execute dbo.usp_ExecuteSqlCommand 
    @databaseName = N'master' 
    , @sqlCommand = N'select Db_Name();'; 
+0

かなり洗練されたソリューションです。ニース。 – Jens

関連する問題