gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:05:15 24 4
gpt4 key购买 nike

我有一种情况,我必须在我们的 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

我对一个包含 23,000 多行的 excel 文件使用了邮件合并。这导致我的 SQL 语句超过 260,000 行。必须有一种更有效的方法来完成这项工作。

如果没有,我将不得不大大分解这段代码。

微软 SQL 服务器 2005

最佳答案

为了让您使用 SSIS 走上正确的轨道,第一步是使用 Execute SQL 任务来创建临时表:

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
);

然后使用数据流任务将数据导入此表(平面文件或 excel 源,您的目标将是 OLE DB 目标。您可能需要将数据流任务上的“延迟验证”设置为 false 和/或“验证”外部元数据”在目标上设置为 false,因为目标是在运行时创建的)。您也可以将临时表永久保留在那里,而只需使用 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;

这里有可能满足竞争条件,因此您应该确保您有约束以阻止并发线程尝试插入相同的记录而导致的任何完整性违规。

为了完整起见,执行 UPSERT 的首选选项是 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);

关于sql - 使用大型 Excel 文件插入/更新 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23639007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com