2017-04-21 152 views
0

嘗試使用另一個存儲過程創建新的存儲過程。使用存儲過程創建存儲過程

CREATE PROCEDURE [dbo].[CreateNewDB] 
@dbName nvarchar(50) 
AS 
BEGIN 
SET NOCOUNT ON; 
EXEC('CREATE DATABASE '[email protected]) 
EXEC('USE '[email protected]+ ' CREATE PROCEDURE [dbo].[usp_GetUser] 
     @id varchar(50) 
     AS 
     BEGIN 
     <<Stored Procedure Logic>> 
     END') 
END 

當我嘗試調用上面的存儲過程如下

DECLARE @return_value int 

EXEC @return_value = [dbo].[CreateNewDB] 
     @dbName = N'MyUserDatabase' 

SELECT 'Return Value' = @return_value 

它創建數據庫而不是存儲過程。

它會引發以下錯誤。

Msg 111, Level 15, State 1, Procedure usp_GetUser, Line 6 
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch. 

回答

1

GO不能在動態sql中使用。你可以使用一個嵌套的SQL查詢這樣

DECLARE @dbName nvarchar(30) = 'abcxys' 

DECLARE @query nvarchar(max) = 'USE ' + Quotename(@dbName) + 
     '; EXEC sp_executesql N''' + N'CREATE PROCEDURE [dbo].[usp_GetUser] 
     @id varchar(50) 
     AS 
     BEGIN 
     select 1 
     END' + ''''; 

PRINT @query 

EXEC (@query) 
0

我分手了旅途中的並用相同的連接上運行它,保持開放,而他們正在運行。它從我從目錄獲得的文件創建存儲過程。

public void RunSprocFile(string sprocFileName, DbContext db) 
    { 
     try 
     { 
      var sprocFileSplit = GetSprocFromFile(sprocFileName).Split(new[] {"GO"}, StringSplitOptions.RemoveEmptyEntries); 
      _connectionManager.OpenConn(db); 
      foreach (var t in sprocFileSplit) 
       if (t.Trim().Length > 0) 
        RunSql(t, db); 
      _connectionManager.CloseConn(db); 
     } 
     catch (Exception e) 
     { 
      RecordException(e); 
     } 
    } 
+0

僅供參考,當你有一羣人想幫助你,你當我們輸入冗長的評論來幫助你從我們下抽出的問題,它不鼓勵我們,幫助您在未來。我們浪費了我們的時間。 – Amy

+0

我從蝙蝠身上得到兩票表決權。 WTF?我正在嘗試學習。我期待了很長時間,一條評論幫助了我,所以謝謝。我很抱歉,但顯然這是一個愚蠢的問題,至少有兩個人一定要打我的觀點。顯然我浪費了我自己的時間,我不應該再問任何問題了。 –