无法运行整个T-SQL查询,但部分我可以

时间:2015-12-01 14:24:05

标签: sql sql-server tsql

盖伊,我对此查询有疑问。我已经尽我所能,现在它已经走到了尽头。如果我运行2分离它完美的工作,但一旦我选择整个事情运行作为片断它给我一个关于临时表已经存在的错误,即使我检查Temp表是否存在并放在最后和开始我称之为每个“批次”。

我真的不知道要发布的查询的哪一部分所以我只是要发布整个事情。如果有人能够让我了解为什么会这样做以及其他提示你可能会看到我做错了。

Use test
    IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL DROP TABLE #TEMP

    IF OBJECT_ID('MetricsServerAudit') IS NOT NULL
        BEGIN 
            CREATE TABLE  #TEMP ([TIME] nvarchar(max) NULL,[DATE] nvarchar(max) NULL,[USER_LOGIN] nvarchar(max) NULL,[USER_NAME] nvarchar(max) NULL,[MODEL_NAME] nvarchar(max) NULL,[SCORECARD_IDENTIFIER] nvarchar(max) NULL,  [SCORECARD_NAME] nvarchar(max) NULL,[ELEMENT_IDENTIFIER] nvarchar(max) NULL,[ELEMENT_NAME] nvarchar(max) NULL,[SERIES_IDENTIFIER] nvarchar(max) NULL,[SERIES_NAME] nvarchar(max) NULL,[PERIOD_NAME] nvarchar(max) NULL,[ACTION_TYPE] nvarchar(max) NULL,[ACTION] nvarchar(max) NULL,[PREVIOUS_VALUE] nvarchar(max) NULL,[VALUE] nvarchar(max) NULL,[UNIT] nvarchar(max) NULL)

                    BULK INSERT #TEMP FROM 'C:\QPR_Logs\Audit\MetricsServerAudit.txt'
                    WITH (FIELDTERMINATOR ='\t', ROWTERMINATOR = '\r', FIRSTROW = 2, KEEPNULLS)

                    UPDATE #TEMP SET [DATE]= REPLACE(CONVERT(VARCHAR(11),[DATE],103),'/' ,'-') 
                    ALTER TABLE #TEMP ALTER COLUMN [DATE] DATE
                    UPDATE #TEMP SET [TIME] = '12:00:00' Where [TIME] = ''
                    UPDATE #TEMP SET [TIME] = REPLACE(REPLACE(REPLACE([TIME], CHAR(10), ''), CHAR(13), ''), CHAR(9), '')
                    UPDATE #TEMP SET [TIME] = REPLACE([TIME], '/', ':')
                    UPDATE #TEMP SET [TIME] = left([TIME], 8)
                    UPDATE #TEMP SET [DATE] = '2015-01-01' Where [DATE] is null


                    INSERT INTO [dbo].[MetricsServerAudit]([DateStamp],[TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT])
                    SELECT CONCAT([DATE],'', [TIME]) AS [DateStamp], [TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT]
                    FROM #TEMP
                    WHERE NOT EXISTS(SELECT [TIME] FROM [dbo].[MetricsServerAudit] WHERE [TIME] = [TIME])
                    DROP TABLE #TEMP
        END

Else --SEPERATOR 
    IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL DROP TABLE #TEMP

    IF OBJECT_ID('MetricsServerAudit') IS NULL
        BEGIN 
            CREATE TABLE  MetricsServerAudit ([DateStamp] nvarchar(max) NULL, [TIME] nvarchar(max) NULL,[DATE] date NULL,[USER_LOGIN] nvarchar(max) NULL,[USER_NAME] nvarchar(max) NULL,[MODEL_NAME] nvarchar(max) NULL,[SCORECARD_IDENTIFIER] nvarchar(max) NULL,[SCORECARD_NAME] nvarchar(max) NULL,[ELEMENT_IDENTIFIER] nvarchar(max) NULL,[ELEMENT_NAME] nvarchar(max) NULL,[SERIES_IDENTIFIER] nvarchar(max) NULL,[SERIES_NAME] nvarchar(max) NULL,[PERIOD_NAME] nvarchar(max) NULL,[ACTION_TYPE] nvarchar(max) NULL,[ACTION] nvarchar(max) NULL,[PREVIOUS_VALUE] nvarchar(max) NULL,[VALUE] nvarchar(max) NULL,[UNIT] nvarchar(max) NULL)
        END
            IF OBJECT_ID('tempdb..#TEMP') IS NULL
                BEGIN
                    CREATE TABLE  #TEMP ([TIME] nvarchar(max) NULL,[DATE] nvarchar(max) NULL,[USER_LOGIN] nvarchar(max) NULL,[USER_NAME] nvarchar(max) NULL,[MODEL_NAME] nvarchar(max) NULL,[SCORECARD_IDENTIFIER] nvarchar(max) NULL,  [SCORECARD_NAME] nvarchar(max) NULL,[ELEMENT_IDENTIFIER] nvarchar(max) NULL,[ELEMENT_NAME] nvarchar(max) NULL,[SERIES_IDENTIFIER] nvarchar(max) NULL,[SERIES_NAME] nvarchar(max) NULL,[PERIOD_NAME] nvarchar(max) NULL,[ACTION_TYPE] nvarchar(max) NULL,[ACTION] nvarchar(max) NULL,[PREVIOUS_VALUE] nvarchar(max) NULL,[VALUE] nvarchar(max) NULL,[UNIT] nvarchar(max) NULL)

                    BULK INSERT #TEMP FROM 'C:\QPR_Logs\Audit\MetricsServerAudit.txt'
                    WITH (FIELDTERMINATOR ='\t', ROWTERMINATOR = '\r', FIRSTROW = 2, KEEPNULLS)

                    UPDATE #TEMP SET [DATE]= REPLACE(CONVERT(VARCHAR(11),[DATE],103),'/' ,'-') 
                    ALTER TABLE #TEMP ALTER COLUMN [DATE] DATE
                    UPDATE #TEMP SET [TIME] = '12:00:00' Where [TIME] = ''
                    UPDATE #TEMP SET [TIME] = REPLACE(REPLACE(REPLACE([TIME], CHAR(10), ''), CHAR(13), ''), CHAR(9), '')
                    UPDATE #TEMP SET [TIME] = REPLACE([TIME], '/', ':')
                    UPDATE #TEMP SET [TIME] = left([TIME], 8)
                    UPDATE #TEMP SET [DATE] = '2015-01-01' Where [DATE] is null                 


                    INSERT INTO [dbo].[MetricsServerAudit]([TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT])
                    SELECT [TIME],[DATE],[USER_LOGIN],[USER_NAME],[MODEL_NAME],[SCORECARD_IDENTIFIER],[SCORECARD_NAME],[ELEMENT_IDENTIFIER],[ELEMENT_NAME],[SERIES_IDENTIFIER],[SERIES_NAME],[PERIOD_NAME],[ACTION_TYPE],[ACTION],[PREVIOUS_VALUE],[VALUE],[UNIT]
                    FROM #TEMP
                    DROP TABLE #TEMP

                    UPDATE [dbo].[MetricsServerAudit] SET [DateStamp] = CONCAT([DATE],'', [TIME])
                    UPDATE [dbo].[MetricsServerAudit] SET [DateStamp] = REPLACE([DateStamp], '/', ':')
                    UPDATE [dbo].[MetricsServerAudit] SET [DateStamp] = CONVERT(datetime,(SUBSTRING([DateStamp],1,10)+' '+SUBSTRING([DateStamp],11,15)))
                    ALTER TABLE [dbo].[MetricsServerAudit] ALTER COLUMN [DateStamp] DATETIME
                END

通过else是我所说的分隔符,因此它上面的所有内容都是“Batch1”, 它下面的一切都是“Batch2”

我得到的错误是:

Msg 2714, Level 16, State 1, Line 36
There is already an object named '#TEMP' in the database.

3 个答案:

答案 0 :(得分:5)

ELSE不是批处理分隔符,您使用且不丢弃的任何临时表都会抛出此错误。

除非您专门更改了批处理分隔符,否则应在批次之间使用GO。这样,任何临时表都将在批处理分离之间删除。

答案 1 :(得分:0)

T-SQL是声明性的,当你执行SQL时,优化器所做的第一件事就是查看你的一批SQL,然后创建一个执行计划(即在任何实际执行之前),因此,对于优化器你确实做了有两个无效的CREATE TABLE #TEMP。你甚至不能在这里使用动态SQL,因为#表的范围是EXEC('')语句 - 你可以使用带有EXEC()的全局临时表。那,或者只是使用两个不同的表名。

答案 2 :(得分:0)

问题是,T-SQL解析器非常简单,可能导致令人惊讶的结果。值得注意的是,很多事情都没有遵循任何流量控制。 E.g。

IF 1 = 0
BEGIN
    DECLARE @a int
END
SET @a = 1

执行时没有错误 - 因为变量从声明点开始直到批处理结束 - 声明不必“到达”。

类似地,一旦引入临时表,它的定义在批处理结束之前是有效的。