我正在尝试创建一个存储过程,该过程将删除一个表,然后创建一个具有相同名称的新表。
然而,当我右键单击表并执行Script Table as ... DROP and CREATE To ... New Query Editor Window
然后将脚本复制到空白存储过程中时,它不会让我创建过程,因为
数据库中已有一个名为“MyTable”的对象
我该怎么办?
注意:新表与旧表的结构不同。我使用其他存储过程对表进行了一些转换,所以最后,我想删除它并从头开始创建。
这是实际的脚本:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spDropAndCreate]
AS
BEGIN
SET NOCOUNT ON;
IF OBJECT_ID ('dbo.MyTable','U') IS NOT NULL
DROP TABLE [dbo].[MyTable]
CREATE TABLE [dbo].[MyTable]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Col1] [nvarchar](50) NULL,
[Col2] [nvarchar](50) NULL,
[Col3] [nvarchar](50) NULL,
[Col4] [nvarchar](50) NULL,
[Col5] [nvarchar](50) NULL,
[Col6] [nvarchar](50) NULL,
[Col7] [nvarchar](50) NULL,
[Col8] [nvarchar](50) NULL,
[Col9] [nvarchar](50) NULL,
[Col10] [nvarchar](50) NULL
)
GO
END
以下是错误消息:
Msg 102,Level 15,State 1,Procedure spDropAndCreate,Line 17 [Batch Start Line 9]
附近的语法不正确
'MyTable'Msg 2714,Level 16,State 6,Line 35
数据库中已有一个名为“MyTable”的对象Msg 102,Level 15,State 1,Line 156
'END'附近的语法不正确
答案 0 :(得分:0)
您需要移除GO
和BEGIN
块中的END
。 GO
是一个批处理分隔符,就像告诉块在它结束之前执行一样。有关详细信息,请查看此previous post。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spDropAndCreate]
AS
BEGIN
SET NOCOUNT ON;
IF OBJECT_ID ('dbo.MyTable','U') IS NOT NULL
DROP TABLE [dbo].[MyTable]
CREATE TABLE [dbo].[MyTable]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Col1] [nvarchar](50) NULL,
[Col2] [nvarchar](50) NULL,
[Col3] [nvarchar](50) NULL,
[Col4] [nvarchar](50) NULL,
[Col5] [nvarchar](50) NULL,
[Col6] [nvarchar](50) NULL,
[Col7] [nvarchar](50) NULL,
[Col8] [nvarchar](50) NULL,
[Col9] [nvarchar](50) NULL,
[Col10] [nvarchar](50) NULL
)
END
答案 1 :(得分:-1)
在GO
语句后添加DROP TABLE
以分隔批次。
但这不适用于程序。而是在sys对象时使用存在。
If exists(select 1 from sys.objects where name = 'mytable')
drop mytable