为什么不能在一个事务中创建和删除表两次?

时间:2015-10-29 14:45:53

标签: sql sql-server

这将抛出错误

  

数据库中已经有一个名为'## TempComment'的对象。

DROP TABLE ##TempComment
CREATE TABLE ##TempComment
( 
    TagValue NvarChar(MAX)
);
DROP TABLE ##TempComment
CREATE TABLE ##TempComment
( 
    TagValue NvarChar(MAX)
);

以上是解决问题的简单方法,但在下面你可以看到我这样做的原因。

我知道这是一个奇怪的请求,但更多的是我想要实现的目标。

  DECLARE @ValuationId INT = 20897
  DECLARE @Count INT = 0
  DECLARE @isCompSale NVARCHAR(MAX)
  DECLARE @Comment nvarchar(250)

    DROP TABLE ##TempComment
    SELECT TagValue
    INTO ##TempComment
    FROM [FormValueLive_sql].[dbo].[ValuationDetail]
    WHERE TagName IN ('sale_1_erf','sale_1_portion','sale_1_township', 'comparable_sale_1_sales_price', 'comparable_sale_1_sales_date', 'sale_1_overall') AND ValuationId = @ValuationId
    SET @isCompSale = (SELECT TagValue FROM [FormValueLive_sql].[dbo].[ValuationDetail] WHERE TagName = 'sale_1_use_as_comparable' AND ValuationId = @ValuationId)

    IF @isCompSale = 'Yes' AND @Count < 3
    Begin
    SELECT @Comment = COALESCE(@Comment + ',','') + TagValue FROM ##TempComment
    SET @Count = @Count + 1
    END

    SET @isCompSale = 'No'

 --So Comments is my collective and only if a condition is met do i take the values of the temp table.

    DROP TABLE ##TempComment
    SELECT TagValue
    INTO ##TempComment
    FROM [FormValueLive_sql].[dbo].[ValuationDetail]
    WHERE TagName IN ('sale_6_erf','sale_6_portion','sale_6_township', 'comparable_sale_6_sales_price', 'comparable_sale_6_sales_date', 'sale_6_overall') AND ValuationId = @ValuationId

    SET @isCompSale = (SELECT TagValue FROM [FormValueLive_sql].[dbo].[ValuationDetail] WHERE TagName = 'sale_6_use_as_comparable' AND ValuationId = @ValuationId)

    IF @isCompSale = 'Yes' AND @Count < 3
    Begin
    SELECT @Comment = COALESCE(@Comment + ', ','') + TagValue FROM ##TempComment
    SET @Count = @Count + 1
    END

    SELECT @Comment

所以评论是我的集体,只有满足条件才能获取临时表的值。 我在评估中有20个销售,其中一个字段检查是否只有在我知道这是真的时才选择销售我是否采用临时值数据。

1 个答案:

答案 0 :(得分:4)

TL; DR 解析器提供错误而不在批处理中运行任何命令。

为什么你不能在一次交易中创建和删除两次表?你可以。问题是在同一批次中创建了两个。

一笔交易,两批:(工作)

BEGIN TRANSACTION

CREATE TABLE ##TempComment
( 
    TagValue NvarChar(MAX)
);
GO
DROP TABLE ##TempComment
CREATE TABLE ##TempComment
( 
    TagValue NvarChar(MAX)
);
COMMIT TRANSACTION

两个交易,一批:(无工作。)

BEGIN TRANSACTION
CREATE TABLE ##TempComment
( 
    TagValue NvarChar(MAX)
);
COMMIT TRANSACTION
DROP TABLE ##TempComment
CREATE TABLE ##TempComment
( 
    TagValue NvarChar(MAX)
);
COMMIT TRANSACTION
GO

下一条证据,新表名只是为了清洁:

CREATE TABLE #t (c INT)
DROP TABLE #t
CREATE TABLE #t (c INT)

我们收到错误, Msg 3701,Level 11,State 5,Line 1 无法删除表'#t',因为它不存在或您没有权限。

现在,放弃#t,DROP TABLE #t。我们得到了,不能删除表'#t',因为它不存在或你没有权限。我们被告知表#t无法创建,因为它已经存在,即使从不创建。

SQL Server解析器正在查看两个create语句,而不考虑丢弃并在执行任何实际工作之前确定将发生错误。 SQL Server仅使用临时表执行此操作,创建永久表的创建工作。

我不了解您的用例,并认为全局临时表可能是错误的选择。但是,您可以通过将创建文件放入字符串并动态运行它们来获得所需的效果,这会将解析分成不同的批次。

EXEC ('CREATE TABLE ##TempComment
    ( 
        TagValue NvarChar(MAX)
    )');
DROP TABLE ##TempComment
EXEC ('CREATE TABLE ##TempComment
    ( 
        TagValue NvarChar(MAX)
    )');