【问题标题】:Create Stored Procedure using stored procedure使用存储过程创建存储过程
【发布时间】:2017-04-21 08:18:13
【问题描述】:

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

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.

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案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) 
    

    【讨论】:

      【解决方案2】:

      我拆分 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);
              }
          }
      

      【讨论】:

      • 仅供参考,如果您有一群人试图帮助您,而您在我们输入冗长的 cmets 来帮助您的同时从我们下面提出问题,这并不鼓励我们提供帮助未来的你。我们浪费了时间。
      • 我马上就得到了两个反对票。怎么回事?我正在尝试学习。我找了很长时间,一条评论确实帮助了我,所以谢谢。对不起,但显然这是一个愚蠢的问题,至少有两个人确保达到我的观点。显然我也浪费了自己的时间,我不应该再问任何问题了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2016-11-11
      相关资源
      最近更新 更多