试图使用另一个存储过程创建新的存储过程。
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.发布于 2017-04-21 09:02:02
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) 发布于 2017-12-13 21:32:34
我拆分了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);
}
}https://stackoverflow.com/questions/43537455
复制相似问题