sql-server - SQL Server 合并
问题描述
我正在从具有 accountId 作为行标识符的平面文件上传 stagingTableB,但它不是一个 int(我希望行标识符是一个 int),所以我在想我们是否可以添加一个唯一的行标识符(或主要键)进入我们的目标表而不复制记录(使用合并和更新)。下面是我的 Merge,它似乎可以工作,但是当我执行包时它会不断添加记录)。请问有什么帮助吗?这是我在 SQL Server 中创建目标表的方式:
Create TABLE TableA(
[CustomerID] [int] IDENTITY(1,1) NOT NULL,
[Account ID] [varchar](50) NULL,
[CustomerName] [varchar](50) NULL,
[Address] [varchar](50) NULL,
[City] [varchar](50) NULL,
[State] [varchar](50) NULL,
[Zip] [varchar](50) NULL,
[Sales Rep ] [varchar](50) NULL,
[Group Code] [varchar](50) NULL,
[Credit Limit] [varchar](50) NULL
) ON [PRIMARY]
这是暂存表的样子:
Create TABLE StagingTableB(
[Account ID] [varchar](50) NULL,
[CustomerName] [varchar](50) NULL,
[Address] [varchar](50) NULL,
[City] [varchar](50) NULL,
[State] [varchar](50) NULL,
[Zip] [varchar](50) NULL,
[Sales Rep ] [varchar](50) NULL,
[Group Code] [varchar](50) NULL,
[Credit Limit] [varchar](50) NULL
)
这是合并查询
MERGE INTO TableA as TARGET
USING StagingTableB as SOURCE
ON
TARGET.[Account ID] = SOURCE.[Account ID]
WHEN MATCHED THEN
UPDATE SET
TARGET.[Account ID] = SOURCE.[Account ID]
,TARGET.[CustomerName] = SOURCE.[CustomerName]
,TARGET.[Address] = SOURCE.[Address]
,TARGET.[City] = SOURCE.[City]
,TARGET.[State] = SOURCE.[State]
,TARGET.[Zip] = SOURCE.[Zip]
,TARGET.[Sales Rep] = SOURCE.[Sales Rep]
,TARGET.[Group Code] = SOURCE.[Group Code]
,TARGET.[Credit Limit] = SOURCE.[Credit Limit]
WHEN NOT MATCHED THEN
INSERT ([Account ID], [CustomerName], [Address], [City], [State], [Zip], [Sales Rep], [Group Code], [Credit Limit])
VALUES
(SOURCE.[Account ID], SOURCE.[CustomerName], SOURCE.[Address],
SOURCE.[City], SOURCE.[State], SOURCE.[Zip], SOURCE.[Sales Rep], SOURCE.[Group Code], SOURCE.[Credit Limit]);
解决方案
触发器在语句级别工作。因此,当使用“合并”时,会为合并语句中涉及的所有 DML 操作触发触发器。相反,将您的代码转换为以下代码以避免来自触发器的不必要插入。
UPDATE Res1
SET
[CustomerName] = Res2.[CustomerName]
,[Address] = Res2.[Address]
,[City] = Res2.[City]
,[State] = Res2.[State]
,[Zip] = Res2.[Zip]
,[Sales Rep] = Res2.[Sales Rep]
,[Group Code] = Res2.[Group Code]
,[Credit Limit] = Res2.[Credit Limit]
FROM TableA Res1
JOIN StagingTableB Res2 ON Res2.[Account ID] = Res1.[Account ID]
INSERT INTO TableA([Account ID], [CustomerName], [Address], [City], [State], [Zip], [Sales Rep], [Group Code], [Credit Limit])
SELECT
Res1.[Account ID]
,Res1.[CustomerName]
,Res1.[Address]
,Res1.[City]
,Res1.[State]
,Res1.[Zip]
,Res1.[Sales Rep]
,Res1.[Group Code]
,Res1.[Credit Limit]
FROM StagingTableB Res1
LEFT JOIN TableA Res2 ON Res2.[Account ID] = Res1.[Account ID]
WHERE Res2.[Account ID] IS NULL
推荐阅读
- python - Scapy - 层的长度字段
- csv - 在 csv 文件中查找模式
- vb.net - 如何修复“关闭阅读器时尝试读取无效 vb.net”
- api - soundcloud api如何获取clientId
- java - 在适配器类中获取 ArrayIndexOutOfBoundsException
- angular - 为什么 ng-show 没有将 div 及其内容隐藏到我的页面中?
- python - python: truncate fractional digits from iso 8601 string
- python - 刷新我的 tkinter 标签并让它用不同的输出内容覆盖它
- jsf - rich:calendar 值在 bean 中没有变化
- yocto - 创建基于 Yocto 项目的所有依赖项的镜像