0

我正在尝试创建一个可以创建多个表和存储过程的存储过程,但是在 GO 附近出现了一堆语法不正确的错误

我正在研究一种 C# 方法来调用存储过程。

我的存储过程类似于

CreateTables @name nvarchar(500)

declare @query nvarchar(MAX) =

'use db1
 GO

 create table '+@name+'_TableA(column1 int, column2 nvarchar(300)) on [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 GO

 create table '+@name+'_TableB(column1 nvarchar(500), column2 nvarchar(350)) on [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 GO

 use db2
 GO

 create table '+@name+'_TableC(column1 int, column2 nvarchar(300)) on [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 GO

 create table '+@name+'_TableD(column1 nvarchar(500), column2 nvarchar(350)) on [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 GO

 create procedure '+@name+'_spA @variable1 int, @variable2 nvarchar(300) as
 begin
     insert into tableA..... 
 end
 GO
 ' 

  exec @query

这是正确的方法吗?

或者,我正在考虑在存储过程中单独执行每个创建语句,但是我需要获取每个语句的结果并将其保存到临时表中,然后在最后返回。

另一种方法是将创建语句硬编码到我的 C# 中并从我的代码中执行每个创建查询,但我理想的解决方案是在一次 SQL 运行中执行所有内容,并获得一个结果集。

我们目前只是手动执行这些查询,但我们希望自动化该过程。

此外,这些是我得到的错误

消息 102,级别 15,状态 1,第 16 行
'GO' 附近的语法不正确。

消息 102,级别 15,状态 1,第 26 行
'GO' 附近的语法不正确。
....
Msg 111, Level 15, State 1, Line 106
'CREATE/ALTER PROCEDURE' 必须是查询批处理中的第一条语句。

消息 134,级别 15,状态 1,第 122 行
变量名称“@variable1”已被声明。变量名称在查询批处理或存储过程中必须是唯一的。

4

1 回答 1

2

动态查询被视为单个批次,因此GO不允许在那里,但它与CREATE object must be the first statement of batch.

如果您的要求打算将所有内容放在一个变量中,则尝试使用嵌套 EXEC 来规避 GO 问题:

 declare @v varchar(max) = 
    'EXEC(''CREATE PROC dbo.test_sp1 AS'')
     EXEC(''CREATE PROC dbo.test_sp2 AS'')
    '
 EXEC @v
于 2019-08-22T01:59:35.523 回答