尝试使用另一个存储过程创建新的存储过程。
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.
答案 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);
}
}