【问题标题】:How to DROP and CREATE a table in SQL Server 2016 Stored Procedure如何在 SQL Server 2016 存储过程中删除和创建表
【发布时间】:2017-11-10 19:24:18
【问题描述】:

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

但是,当我右键单击表格并执行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

这是错误信息:

消息 102,级别 15,状态 1,过程 spDropAndCreate,第 17 行 [批处理开始第 9 行]
'MyTable' 附近的语法不正确

消息 2714,第 16 级,状态 6,第 35 行
数据库中已经有一个名为“MyTable”的对象

消息 102,第 15 级,状态 1,第 156 行
'END' 附近的语法不正确

【问题讨论】:

  • 1) 发布脚本 2) 发布实际错误

标签: tsql sql-server-2016


【解决方案1】:

您需要删除 BEGINEND 块内的 GOGO 是一个批处理分隔符,就像告诉块在它结束之前执行。查看此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

【讨论】:

    【解决方案2】:

    DROP TABLE 语句后添加GO 以分隔批次。

    但这不适用于程序。而是在 sys 对象时使用存在。

    If exists(select 1 from sys.objects where name = 'mytable')
    drop mytable
    

    【讨论】:

    • 存储过程中不能有GOBEGINEND 之间的所有内容都是存储过程主体
    • 没错,我忽略了它是在一个程序中。修复了一个 proc @Red Good eye
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多