使用CREATE PROCEDURE创建的过程使用ALTER PROCEDURE进行默认设置

时间:2017-05-19 16:46:38

标签: sql sql-server stored-procedures

我有一个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

显然效果很好。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

GO

CREATE PROCEDURE [dbo].[InitMyTable] AS

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

/****** 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