我有一个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
显然效果很好。
如何创建一个生成没有该行的过程的脚本?
答案 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