首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用存储过程创建存储过程

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

Stack Overflow用户
提问于 2017-04-21 08:18:13
回答 2查看 133关注 0票数 0

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

代码语言:javascript
复制
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

当我试图调用上述存储过程时,如下所示

代码语言:javascript
复制
DECLARE @return_value int

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

SELECT  'Return Value' = @return_value

它创建数据库,而不是存储过程。

它引发以下错误。

代码语言:javascript
复制
Msg 111, Level 15, State 1, Procedure usp_GetUser, Line 6
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-21 09:02:02

GO不能在动态sql中使用。您可以使用这样的嵌套sql查询

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-12-13 21:32:34

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43537455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档