【问题标题】:Stored Procedure doesn't create a temp table even after the select * into command is executed [duplicate]即使在执行 select * into 命令后,存储过程也不会创建临时表 [重复]
【发布时间】:2020-01-20 21:04:24
【问题描述】:

我最近遇到了一个问题,即我的 SQL Server 存储过程在特别要求时没有创建临时表。但是,它不会引发错误。当我尝试将数据插入临时表时失败。你能指出我在这个过程中做错了什么吗?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER   PROCEDURE [dbo].[CDC_PROC]
@SourceSystemName nvarchar(30),
@DomainTypeDescription nvarchar(30), 
@HashDescription nvarchar(30)
AS 
BEGIN 
  SET NOCOUNT ON;

  DECLARE @CreateInsertTableSql NVARCHAR(MAX);
  DECLARE @CreateUpdateTableSql NVARCHAR(MAX);
  DECLARE @InsertNewIntoTgtTableSql NVARCHAR(MAX);
  DECLARE @InsertUpdatedIntoTgtTableSql NVARCHAR(MAX);
  DECLARE @InsertUpdatedContractsSQL NVARCHAR(MAX);
  DECLARE @InsertNewContractsSQL NVARCHAR(MAX);
  DECLARE @UpdateTimeStampsSQL NVARCHAR(MAX);
  DECLARE @TargetTableName NVARCHAR(128);
  DECLARE @InsertTempTableName NVARCHAR(128);
  DECLARE @UpdateTempTableName NVARCHAR(128);
  DECLARE @TempTableColumnList NVARCHAR(MAX);
  DECLARE @TargetTableColumnList NVARCHAR(MAX);

-- Setting target and temporary table names as needed.
 SET @TargetTableName =  @DomainTypeDescription + N'AAH'
 SET @InsertTempTableName = N'#' + @DomainTypeDescription + N'AAH_InsertTemp'
 SET @UpdateTempTableName = N'#' + @DomainTypeDescription + N'AAH_UpdateTemp'

-- Creating temp tables.
 SET @CreateInsertTableSql = N'select * into ' + @InsertTempTableName + N' from (select * from dbo.' + @DomainTypeDescription + N' where 1=2) AS X'
 SET @CreateUpdateTableSql = N'select * into ' + @UpdateTempTableName + N' from (select * from dbo.' + @DomainTypeDescription + N' where 1=2) AS Y'

 print @CreateInsertTableSql
 print @CreateUpdateTableSql

 EXECUTE sp_executesql @CreateInsertTableSql
 EXECUTE sp_executesql @CreateUpdateTableSql

-- Capturing field names from target and temp tables for processing.
 SET @TempTableColumnList = N'(' + (SELECT STRING_AGG(COLUMN_NAME, ',') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @DomainTypeDescription and COLUMN_NAME not like '%PointOfView%Date') + N')'
 SET @TargetTableColumnList = (SELECT STRING_AGG(COLUMN_NAME, ',') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TargetTableName and COLUMN_NAME not like '%PointOfView%Date')

-- Executing procedures to identify New and Updated contracts. Capturing results in the temporary tables.
 SET @InsertUpdatedContractsSQL = N'insert ' + @UpdateTempTableName
         + @TempTableColumnList +
' Exec [spFindUpdatedDomainRecords] @SourceSystemName = ' + @SourceSystemName + ', @DomainTypeDescription = ' + @DomainTypeDescription + ', @HashDescription = ' + @HashDescription

 SET @InsertNewContractsSQL = N'insert ' + @InsertTempTableName
         + @TempTableColumnList +
 ' Exec [spFindNewDomainRecords] @SourceSystemName = ' + @SourceSystemName + ', @DomainTypeDescription = ' + @DomainTypeDescription 

-- Inserting data from temporary tables into target table.
 SET @InsertNewIntoTgtTableSql = N'insert into ' + @TargetTableName + N' (' + @TargetTableColumnList + N', PointOfViewStartDate, PointOfViewStopDate) select ' + @TargetTableColumnList + N', NULL, NULL from ' + @InsertTempTableName
 SET @InsertUpdatedIntoTgtTableSql = N'insert into ' + @TargetTableName + N' (' + @TargetTableColumnList + N', PointOfViewStartDate, PointOfViewStopDate) select ' + @TargetTableColumnList + N', NULL, NULL from ' + @UpdateTempTableName

-- Updating Point of View Start and Stop dates with current date and high end dates respectively.
 SET @UpdateTimeStampsSQL = N'update ' + @TargetTableName + N' set  PointOfViewStartDate = cast(GETDATE() as datetime2(0)), PointOfViewStopDate = cast(''9999-12-31 00:00:00'' as datetime2(0))'

 EXECUTE sp_executesql @InsertUpdatedContractsSQL
 EXECUTE sp_executesql @InsertNewContractsSQL
 SET IDENTITY_INSERT @TargetTableName ON
 EXECUTE sp_executesql @InsertNewIntoTgtTableSql
 EXECUTE sp_executesql @InsertUpdatedIntoTgtTableSql
 SET IDENTITY_INSERT @TargetTableName OFF
 EXECUTE sp_executesql @UpdateTimeStampsSQL

END

我用下面的命令执行它。它给出了一个错误。

Exec AAH_CDC_PROC @SourceSystemName = 'XYZ', @DomainTypeDescription = 'ABC', @HashDescription = 'AAH';

Msg 208, Level 16, State 0, Line 1
Invalid object name '#ABCAAH_UpdateTemp'.
Msg 208, Level 16, State 0, Line 1
Invalid object name '#ABCAAH_InsertTemp'.
Msg 208, Level 16, State 0, Line 1
Invalid object name '#ABCAAH_InsertTemp'.
Msg 208, Level 16, State 0, Line 1
Invalid object name '#ABCAAH_UpdateTemp'.

【问题讨论】:

    标签: sql-server azure-database-mysql


    【解决方案1】:

    您需要将其设为 ##Table 而不是 #Table

    您可能还必须在创建之前先检查##Table 是否存在。

    【讨论】:

    • 请您解释一下原因
    • 我要求您通过解释为什么您的建议是答案来使您的答案成为一个完整的答案。关于 SO 的所有答案都应该是独立的,并且对于现在或将来任何时候来阅读它们的任何人都有意义。
    • 我知道你想帮助 OP,这正是我要求你解释为什么你的问题是答案的原因,因为否则 OP 不明白它如何解决他们的问题并且可能会问一个以后再问类似的问题。这是您帮助他们学习的机会。 SO 的目的是创建一个对现在和将来的程序员都有价值的信息存储库,因此为什么答案应该尽可能详细和独立,以便在未来几年继续使社区受益。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多