使用大型Excel文件插入/更新SQL

我有一种情况,我必须在ERP的表格中插入/更新许多信息。 我首先要检查表,看看是否存在信息,如果没有,插入,如果是的话,更新。

我有下面的示例代码。

IF NOT EXISTS(SELECT * FROM EXT00101 WHERE PT_Window_ID='ITEM_SHIP_MAINT' and PT_UD_Key='18 RND PA' and PT_UD_Number=5) BEGIN INSERT INTO EXT00101 VALUES('ITEM_SHIP_MAINT', '18 RND PA', 5, '70') End IF EXISTS(SELECT * FROM EXT00101 WHERE PT_Window_ID='ITEM_SHIP_MAINT' and PT_UD_Key='18 RND PA' and PT_UD_Number=5) BEGIN UPDATE EXT00101 SET STRGA255='70' WHERE PT_Window_ID='ITEM_SHIP_MAINT' and PT_UD_Key='18 RND PA' and PT_UD_Number=5; END 

我使用了一个邮件合并与一个超过23000行的Excel文件。 这导致我的SQL语句是260000行。 必须有一个更有效的方法来完成这一点。

如果不是的话,我将不得不相当的破解这个代码。

Microsoft SQL Server 2005

为了让你在使用SSIS的正确轨道上,第一步是使用Execute SQL任务来创build登台表:

 IF (OBJECT_ID(N'dbo.tmpEXT00101Staging') IS NOT NULL DROP TABLE dbo.tmpEXT00101Staging; CREATE TABLE dbo.tmpEXT00101Staging ( PT_Window_ID VARCHAR(50) NOT NULL, PT_UD_Key VARCHAR(50) NOT NULL, PT_UD_Number INT NOT NULL, STRGA255 VARCHAR(50) NOT NULL ); 

然后使用数据stream任务将数据导入到此表(平面文件或excel源文件,目标文件是OLE DB目标文件),您可能需要将数据stream任务中的“延迟validation”设置为“假”和/或“validation外部元数据“在目标上为假,因为目标是在运行时创build的)。 您也可以永久保留您的登台表,而只需使用TRUNCATE TABLE dbo.tmpEXT00101Staging在每次执行开始时将其清除。

最后使用这个临时表来更新你的主表(并且如果你不想永久地保留临时表来清理临时表)

 BEGIN TRAN; -- UPDATE ROWS THAT EXIST UPDATE t SET STRGA255 = st.STRGA255 FROM dbo.EXT00101 t INNER JOIN dbo.tmpEXT00101Staging st ON st.PT_Window_ID = T.PT_Window_ID AND st.PT_UD_Key = t.PT_UD_Key AND st.PT_UD_Number = t.PT_UD_Number; -- INSERT ROWS THAT DO NOT EXIST INSERT EXT00101 (PT_Window_ID, PT_UD_Key, PT_UD_Number, STRGA255) SELECT PT_Window_ID, PT_UD_Key, PT_UD_Number, STRGA255 FROM dbo.tmpEXT00101Staging st WHERE NOT EXISTS ( SELECT 1 FROM dbo.EXT00101 t WHERE st.PT_Window_ID = T.PT_Window_ID AND st.PT_UD_Key = t.PT_UD_Key AND st.PT_UD_Number = t.PT_UD_Number ); COMMIT TRAN; -- CLEAN UP AND DROP STAGING TABLE (OPTIONAL) IF (OBJECT_ID(N'dbo.tmpEXT00101Staging') IS NOT NULL DROP TABLE dbo.tmpEXT00101Staging; 

有可能在这里遇到竞争条件,所以你应该确保你有限制,通过并发线程试图插入相同的logging来阻止任何完整性违反。

为了完整起见,执行UPSERT的最佳select是MERGE(如果从任何时候都从2005年升级):

 MERGE dbo.EXT00101 WITH (HOLDLOCK) AS t USING dbo.tmpEXT00101Staging AS st ON st.PT_Window_ID = T.PT_Window_ID AND st.PT_UD_Key = t.PT_UD_Key AND st.PT_UD_Number = t.PT_UD_Number WHEN MATCHED THEN UPDATE SET STRGA255 = st.STRGA255 WHEN NOT MATCHED THEN INSERT (PT_Window_ID, PT_UD_Key, PT_UD_Number, STRGA255) VALUES (st.PT_Window_ID, st.PT_UD_Key, st.PT_UD_Number, st.STRGA255); 
Interesting Posts