2016-10-27 64 views
2

我使用動態SQL創建數據庫表的動態SQL 「使用[DB]」 沒有奏效

這是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-Server?) – 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); 

這隻要你保持一個EXECUTE內返回<MyDatabase>

1

試試這個:(如果你使用的執行,數據庫上下文將只更改爲只執行)

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