使用存储过程创建存储过程

时间:2017-04-21 08:18:13

标签: sql-server stored-procedures

尝试使用另一个存储过程创建新的存储过程。

CREATE PROCEDURE [dbo].[CreateNewDB]
@dbName nvarchar(50)
AS
BEGIN
SET NOCOUNT ON;
EXEC('CREATE DATABASE '+@dbName)
EXEC('USE '+@dbName+ ' 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.

2 个答案:

答案 0 :(得分: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) 

答案 1 :(得分:0)

我分开了go并使用相同的连接运行它,在它们运行时保持打开状态。它从我从目录中获取的文件创建存储过程。

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);
        }
    }