如何在SQL Server 2016存储过程中删除和创建表

时间:2017-11-10 19:24:19

标签: tsql sql-server-2016

我正在尝试创建一个存储过程,该过程将删除一个表,然后创建一个具有相同名称的新表。

然而,当我右键单击表并执行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'附近的语法不正确

2 个答案:

答案 0 :(得分:0)

您需要移除GOBEGIN块中的ENDGO是一个批处理分隔符,就像告诉块在它结束之前执行一样。有关详细信息,请查看此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
相关问题