首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 向暫存表插入資料:INSERT INTO vs SELECT INTO 差異與陷阱

     編輯:關於SqlServer

正確寫法:INSERT INTO #TempTable

INSERT INTO #DirtyOldWIPBOM
SELECT TOP (100) PERCENT
    dbo.WIP_BOM.Model,
    dbo.WIP_BOM.PartNumber,
    WIP_BOM.WIP
FROM dbo.WIP_BOM
LEFT OUTER JOIN dbo.BOM_CHINA
    ON LTRIM(dbo.WIP_BOM.Model) = LTRIM(dbo.BOM_CHINA.Model)
   AND LTRIM(dbo.WIP_BOM.PartNumber) = LTRIM(dbo.BOM_CHINA.PartNumber)
   AND dbo.WIP_BOM.Qty = dbo.BOM_CHINA.Qty
   AND BOM_CHINA.WIP = WIP_BOM.WIP
WHERE (dbo.BOM_CHINA.Model IS NULL)
  AND EXISTS (
      SELECT * FROM dbo.BOM_CHINA
      WHERE WIP = WIP_BOM.WIP
        AND LTRIM(Model) = LTRIM(WIP_BOM.Model)
  )

錯誤寫法:SELECT INTO #TempTable

SELECT TOP (100) PERCENT ... INTO #DirtyOldWIPBOM
FROM ...

執行時會報錯:There is already an object named '#DirtyOldWIPBOM' in the database

原因分析

  • SELECT INTO 會建立新資料表,若暫存表已存在(同一 Session 內先前已建立),直接報錯。
  • INSERT INTO 要求暫存表已存在,需先用 CREATE TABLE #TempTable (...) 定義結構,再插入資料,可重複執行不衝突。

最佳實務建議

  1. 優先使用 CREATE TABLE #TempTable 明確定義結構(資料類型、可空性、索引),再 INSERT INTO。
  2. 避免使用游標處理逐列邏輯;以暫存表或表值變數集合操作取代,效能可提升數百倍(實測 700 列從 2 小時降至 <1 秒)。
  3. 暫存表命名建議加上業務前綴(如 #WIP_DirtyOld),減少衝突機率。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved