将用户友好的 Excel sheet 导入具有许多外键的 SQL 服务器 table
Importing user-friendly Excel sheet into a SQL Server table that has many foreign keys
我有一个 Excel sheet 由 HR 员工填充,其中包含数千条客户记录,看起来像这样:
User Friendly Excel Sheet Example Screenshot
我的客户 SQL 服务器 table 架构如下所示
CREATE TABLE [dbo].[Clients] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (100) NOT NULL,
[Photo] VARCHAR (200) NOT NULL,
[PolicyID] INT NOT NULL,
[BirthDay] DATE NOT NULL,
[Gender] BIT NOT NULL,
[Title] NVARCHAR (100) NULL,
[Nationality] NVARCHAR (100) NOT NULL,
[Relationship] NVARCHAR (50) NOT NULL,
[ClassID] INT NOT NULL,
[SponsorID] INT NULL,
[HRID] INT NOT NULL,
[Active] BIT CONSTRAINT [DF_Clients_Active] DEFAULT ((1)) NOT NULL,
[StartingDate] DATE NOT NULL,
[EndingDate] DATE NOT NULL,
[AddingDate] DATETIME NOT NULL,
[Creator] INT NOT NULL,
[UniqueID] NVARCHAR (50) NULL,
[PassportNo] NVARCHAR (50) NULL,
CONSTRAINT [PK_Clients] PRIMARY KEY CLUSTERED ([ID] ASC),
CONSTRAINT [FK_Clients_Clients] FOREIGN KEY ([SponsorID]) REFERENCES [dbo].[Clients] ([ID]),
CONSTRAINT [FK_Clients_Employees] FOREIGN KEY ([HRID]) REFERENCES [dbo].[Employees] ([ID]),
CONSTRAINT [FK_Clients_Employees1] FOREIGN KEY ([Creator]) REFERENCES [dbo].[Employees] ([ID]),
CONSTRAINT [FK_Clients_Policy] FOREIGN KEY ([PolicyID]) REFERENCES [dbo].[Policy] ([ID]),
CONSTRAINT [FK_Clients_Classes] FOREIGN KEY ([ClassID]) REFERENCES [dbo].[Classes] ([ID])
);
实现此类插入的最佳方法是什么?
我试过使用 SqlBulkCopy
但它不允许对插入的行进行任何操作。
我也尝试过使用 SqlAdapter.Update(Datatable)
但它失败了,因为我使用 ExcelDataReader
阅读了 Excel sheet 然后尝试添加一些列,例如 Creator
和 Adding Date
在 运行 时间,当我尝试 运行 Adapter.Update(ModifiedDatatable)
它抛出异常
Update requires a valid UpdateCommand when passed DataRow collection with modified rows
当我尝试使用 SqlBulkCopy
插入这个 Excel sheet 它按预期工作
Excel Sheet with Foreign Keys Screenshot
但是强制最终用户在导入前在Excel sheet中放入一些外键是不对的。
通知:
很抱歉将屏幕截图上传到 Tinypic,但由于我的声望点,我无法将它们上传到这里。
提前致谢
在这种情况下,我会创建一个 SSIS 包。 SSIS 可以从 Excel 中读取,您可以获取它来查询数据库以获取额外信息,以构建不会违反 FK 约束的有效数据集。
我有一个 Excel sheet 由 HR 员工填充,其中包含数千条客户记录,看起来像这样:
User Friendly Excel Sheet Example Screenshot
我的客户 SQL 服务器 table 架构如下所示
CREATE TABLE [dbo].[Clients] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (100) NOT NULL,
[Photo] VARCHAR (200) NOT NULL,
[PolicyID] INT NOT NULL,
[BirthDay] DATE NOT NULL,
[Gender] BIT NOT NULL,
[Title] NVARCHAR (100) NULL,
[Nationality] NVARCHAR (100) NOT NULL,
[Relationship] NVARCHAR (50) NOT NULL,
[ClassID] INT NOT NULL,
[SponsorID] INT NULL,
[HRID] INT NOT NULL,
[Active] BIT CONSTRAINT [DF_Clients_Active] DEFAULT ((1)) NOT NULL,
[StartingDate] DATE NOT NULL,
[EndingDate] DATE NOT NULL,
[AddingDate] DATETIME NOT NULL,
[Creator] INT NOT NULL,
[UniqueID] NVARCHAR (50) NULL,
[PassportNo] NVARCHAR (50) NULL,
CONSTRAINT [PK_Clients] PRIMARY KEY CLUSTERED ([ID] ASC),
CONSTRAINT [FK_Clients_Clients] FOREIGN KEY ([SponsorID]) REFERENCES [dbo].[Clients] ([ID]),
CONSTRAINT [FK_Clients_Employees] FOREIGN KEY ([HRID]) REFERENCES [dbo].[Employees] ([ID]),
CONSTRAINT [FK_Clients_Employees1] FOREIGN KEY ([Creator]) REFERENCES [dbo].[Employees] ([ID]),
CONSTRAINT [FK_Clients_Policy] FOREIGN KEY ([PolicyID]) REFERENCES [dbo].[Policy] ([ID]),
CONSTRAINT [FK_Clients_Classes] FOREIGN KEY ([ClassID]) REFERENCES [dbo].[Classes] ([ID])
);
实现此类插入的最佳方法是什么?
我试过使用 SqlBulkCopy
但它不允许对插入的行进行任何操作。
我也尝试过使用 SqlAdapter.Update(Datatable)
但它失败了,因为我使用 ExcelDataReader
阅读了 Excel sheet 然后尝试添加一些列,例如 Creator
和 Adding Date
在 运行 时间,当我尝试 运行 Adapter.Update(ModifiedDatatable)
它抛出异常
Update requires a valid UpdateCommand when passed DataRow collection with modified rows
当我尝试使用 SqlBulkCopy
插入这个 Excel sheet 它按预期工作
Excel Sheet with Foreign Keys Screenshot
但是强制最终用户在导入前在Excel sheet中放入一些外键是不对的。
通知:
很抱歉将屏幕截图上传到 Tinypic,但由于我的声望点,我无法将它们上传到这里。
提前致谢
在这种情况下,我会创建一个 SSIS 包。 SSIS 可以从 Excel 中读取,您可以获取它来查询数据库以获取额外信息,以构建不会违反 FK 约束的有效数据集。