使用 CREATE PROCEDURE 创建的过程 使用 ALTER 过程默认创建的过程



我有一个SQL脚本,它创建了一个如下所示的过程:

IF OBJECT_ID('dbo.InitMyTable') IS NOT NULL 
    DROP PROCEDURE [dbo].[InitMyTable] 
GO
CREATE PROCEDURE [dbo].[InitMyTable] AS
BEGIN
CREATE TABLE MyTable (
    ID int,
    Name varchar(16),
    Data text
);
END

它创建了一个如下所示的过程:

GO
/****** Object:  StoredProcedure [dbo].[InitMyTable]    Script Date: 5/19/2017 12:30:45 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[InitMyTable] AS
BEGIN
CREATE TABLE myTable (
    ID int,
    Name varchar(16),
    Data text
);
END

我的问题是创建的过程没有创建表,但是当我删除该行时

ALTER PROCEDURE [dbo].[InitMyTable] AS

它显然工作正常。

如何创建一个脚本来生成没有该行的过程?

看起来你以某种方式编写了存储过程的脚本 - 可能是在SQL Server Management Studio (SSMS(中,通过右键单击对象资源管理器窗口中的进程并单击"修改"。 执行此操作时,SSMS 会为你生成一个脚本,该脚本将更改现有存储过程。

下面的 DDL 语句创建过程,但它们不是过程的一部分

IF OBJECT_ID('dbo.InitMyTable') IS NOT NULL 
    DROP PROCEDURE [dbo].[InitMyTable] 
GO
CREATE PROCEDURE [dbo].[InitMyTable] AS

同样的事情也适用于 SSMS 生成的代码。 SSMS 已生成可更改现有存储过程的代码,但下面的 DDL 实际上并不是过程本身的一部分:

/****** Object:  StoredProcedure [dbo].[InitMyTable]    Script Date: 5/19/2017 12:30:45 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[InitMyTable] AS

存储过程代码本身仍然存在:

CREATE TABLE MyTable (
    ID int,
    Name varchar(16),
    Data text
);

请注意,如果此存储过程运行两次,它将失败,因为表 MyTable 已存在。 若要避免此错误,该过程可以首先检查表是否存在:

if not exists (select 1 from sys.tables where name = 'MyTable')
begin
    create table MyTable...
end

最新更新