我有一个 MS SQL Server 2012 和下表:
CREATE TABLE dzp.contractid (
id bigint PRIMARY KEY IDENTITY(1,1),
VNR char(18) NOT NULL,
CONSTRAINT UC_VNR UNIQUE (VNR))
Run Code Online (Sandbox Code Playgroud)
对于上下文,VNR 表示字符串形式的唯一合同编号。
我想导入一个包含合同信息的 csv 文件,每个合同可能有多行。为了避免查询 char(18),我尝试在加载时使用临时表的 INSERT-Trigger 规范化数据。
流程是:
csv-file --> staging table --> insert trigger --> normalized tables
Run Code Online (Sandbox Code Playgroud)
在我的触发器中,我正在尝试以下操作:
BEGIN TRY
INSERT INTO dzp.contractid(VNR)
SELECT VNR
FROM dzp.accounts_stage
END TRY
BEGIN CATCH
-- ignore unique constraint violation error, raise otherwise
IF ERROR_NUMBER() <> 2627
RAISERROR ('blah', 16, 1)
END CATCH
Run Code Online (Sandbox Code Playgroud)
所以我希望实现的基本上是:
sql-server constraint insert sql-server-2012 unique-constraint
我对数据库问题没有太多经验,所以请原谅文字墙,我相信上下文对于理解问题和目标很重要。
我每天都会从另一个系统收到一个 CSV 文件,我希望将其保留在 Microsoft SQL Server 上运行的数据库中。为了实现这一点,我每天安排一个 PowerShell 脚本,它使用 bcp 实用程序将 CSV ( accounts.csv ) “加载”到accounts_stage
具有 CSV 文件“精确”布局的表 ( ) 中。此外,我将时间戳“写入”到另一个表 ( import_stage
) 中。该accounts_stage
表具有触发器集,并且 bcp 配置为触发该触发器。
导入完成后,我想“规范化”数据。对于一个基本示例,假设这仅涉及合同编号(在 CSV 文件中名为“Vnr”的字段),它是一个字符串。我有另一个表 ( contracts
),它被触发器填充:
INSERT INTO dzp.contractid(vnr)
SELECT DISTINCT
a.Vnr
FROM dzp.accounts_stage a
WHERE NOT EXISTS(
SELECT id.vnr
FROM dzp.contractid id
)
Run Code Online (Sandbox Code Playgroud)
这应该并且似乎完成了将所有导入到表中的合同编号contractids
。contractids.contractId
是 BIGINT PRIMARY KEY、IDENTITY 和自动增量。
我将导入元数据添加到我的表中,如下所示:
CREATE TABLE #IMPORTMETADATA
([importid] bigint
,[generated_timestamp] datetime …
Run Code Online (Sandbox Code Playgroud)