【问题标题】:How come stored procedure will not create table with IF statement为什么存储过程不会使用 IF 语句创建表
【发布时间】:2015-05-05 19:01:05
【问题描述】:
USE [WORKFILES]
GO
/****** Object:  StoredProcedure [dbo].[MLINT]    Script Date: 05/04/2015 16:49:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[MLINT]

AS

IF OBJECT_ID('WORKFILES.dbo.MLINT05', 'U') IS NULL

BEGIN
        --CREATE CMPDTE TABLE
CREATE TABLE WORKFILES.dbo.MLINT05
(DTSTAMP DATETIME NOT NULL)
END

BEGIN
        --INSERT TIMESTAMP
INSERT INTO WORKFILES.dbo.MLINT05
SELECT (getdate())
END

BEGIN
SELECT CONVERT(varchar(20), DTSTAMP)
FROM [WORKFILES].[dbo].[MLINT05]
END

我在我的 SP 中添加了一个 go

USE [WORKFILES]
GO
/****** Object:  StoredProcedure [dbo].[MLINT]    Script Date: 05/04/2015 16:49:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[MLINT]

AS

IF OBJECT_ID('WORKFILES.dbo.MLINT05') IS NULL
GO

BEGIN
        --CREATE CMPDTE TABLE
CREATE TABLE WORKFILES.dbo.MLINT05
(DTSTAMP DATETIME NOT NULL)
END

BEGIN
        --INSERT TIMESTAMP
INSERT INTO WORKFILES.dbo.MLINT05
SELECT (getdate())
END

BEGIN
SELECT CONVERT(varchar(20), DTSTAMP)
FROM [WORKFILES].[dbo].[MLINT05]
END

【问题讨论】:

  • 您可能需要在帖子正文中澄清您的问题,并添加一些您尝试过的事情的示例以获得任何帮助。您可以随时更新您的问题。欢迎来到栈溢出,推荐阅读:stackoverflow.com/help/how-to-ask
  • 运行select OBJECT_ID('WORKFILES.dbo.MLINT05', 'U')会得到什么?
  • 当我选择 OBJECT_ID('WORKFILES.dbo.MLINT05', 'U') 我得到(无列名),结果为 289526398
  • 我现在的问题是一旦我执行,表将被插入getdate。但是如果我再次运行,错误消息表明我的表已经在数据库中,并且 select 语句不会执行。
  • 这是由sql引擎的工作方式造成的。它会解析您的过程,但是当它尝试执行它时,引擎足够聪明,可以意识到您的表已经存在。如果你想做这种事情,你需要把创建表的逻辑放在动态 sql 中。并且将 GO 放在一个过程中是行不通的。 GO 是默认的批处理分隔符,不是 t-sql 语句。

标签: sql sql-server if-statement stored-procedures


【解决方案1】:

Management Studio 客户端使用go 关键字来分隔批次。您不能在存储过程中使用它。事实上,如果您在 SSMS 中的存储过程定义中使用gogo 将标志着该过程的结束。

您的过程在 SQL Server 2012 中运行良好。当旧版本看到已存在的表的 create table 时,可能会出错。如果这是真的,您可以使用动态 SQL 来解决这个问题:

IF OBJECT_ID('WORKFILES.dbo.MLINT05', 'U') IS NULL
    BEGIN
    EXEC (N'CREATE TABLE WORKFILES.dbo.MLINT05 (DTSTAMP DATETIME NOT NULL)')
    END

【讨论】:

  • 我使用的是 SQL Server 2008 R2。使用此 IF 语句后,我仍然无法让存储过程创建表。我添加了以下内容: IF OBJECT_ID('WORKFILES.dbo.MLINT05', 'U') IS NULL BEGIN EXEC (N'CREATE TABLE WORKFILES.dbo.MLINT05 (DTSTAMP DATETIME NOT NULL)') END --CREATE CMPDTE TABLE BEGIN CREATE TABLE WORKFILES.dbo.MLINT05 (DTSTAMP DATETIME NOT NULL) END --INSERT TIMESTAMP BEGIN INSERT INTO WORKFILES.dbo.MLINT05 SELECT (getdate()) END BEGIN SELECT CONVERT(varchar(20), DTSTAMP) FROM [WORKFILES].[dbo ].[MLINT05] 结束
  • 您可以将insertselect 放入exec 电话中吗?请注意,动态创建表并不常见,但我认为您有充分的理由
  • 我添加了 exec 调用以及我的 insert 和 select 语句。但是创建、插入和选择语句只有在我单独运行时才有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多