2017-04-21 170 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?我正在尝试学习。我期待了很长时间,一条评论帮助了我,所以谢谢。我很抱歉,但显然这是一个愚蠢的问题,至少有两个人一定要打我的观点。显然我浪费了我自己的时间,我不应该再问任何问题了。 –