如何使用来自其他源的数据更新SQL Server表(DataTable)
本文关键字:Server SQL DataTable 更新 数据 何使用 其他 | 更新日期: 2023-09-27 18:24:11
我有一个DataTable
,它是从.xls表生成的。
我想将此DataTable
存储到SQL Server数据库中的现有表中。
我使用SqlBulkCopy
来存储具有唯一PK的行。
问题是,我还有其他行与SQL Server表具有相同的PK,但与SQL Server表格相比,它们包含的单元格具有不同的值。
简而言之:
假设在我的DataTable
中,我有一排像这样:
id(PK)|名称|编号
005 | abc | 123
006|lge|122
对于我的SQL server,我有这样的东西;
id(PK)|名称|编号
004 | cbs | 345
005 | lks | 122
现在您可以看到行006可以使用SqlBulkCopy
直接上载到SQL Server中。另一方面,由于SQL server表包含具有相同PK的行,因此无法使用它插入行005。
现在我尝试手动提取该行。将每个单元格提取到ArrayList中,然后生成UPDATE Table语句。然而,这种方法似乎是不可行的,因为我有这么多行要处理。
我正在寻找一种更好的方法来实现这个目标。
感谢您的帮助。
感谢
使用以下代码:
C#从DataTable读取数据并准备XML数据的侧代码:
DataTable dt = new DataTable();
StringBuilder sb = new StringBuilder();
sb.Append("<R>");
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("<C><ID>" + dt.Rows[0].ToString() + "</ID>");
sb.Append("<N>" + dt.Rows[1].ToString() + "</N>");
sb.Append("<I>" + dt.Rows[2].ToString() + "</I></C>");
}
sb.Append("</R>");
///pass XML string to DB side
///
//sb.ToString(); //here u get all data from data table as xml format
数据库端存储过程(需要更新表名):
CREATE PROCEDURE dbo.UpdateData
-- Add the parameters for the stored procedure here
@data XML
AS
BEGIN
SET NOCOUNT ON;
-- keep data into temp table
create table #tmp_data (id nchar(2),name varchar(20), number int)
DECLARE @XMLDocPointer INT
EXEC sp_xml_preparedocument @XMLDocPointer OUTPUT, @DATA
INSERT INTO #tmp_data(id,name,number)
SELECT ID,N,I
FROM OPENXML(@XMLDocPointer,'/R/C',2)
WITH(
ID nchar(30),
N VARCHAR(20),
I int
)
EXEC sp_xml_removedocument @XMLDocPointer
begin tran
-------------------INSERT not existing ones
INSERT INTO TABLE (id,name,number)
SELECT id,name,number
FROM #tmp_data
WHERE NOT EXISTS
(
SELECT 1
FROM TABLE
WHERE ID = #tmp_data.ID
)
--- update existing ones
UPDATE TABLE
SET name = #tmp_data.name, number = #tmp_data.number
FROM #tmp_data
WHERE #tmp_data.id = TABLE.id
commit tran
if(@@error <> 0)
rollback tran
END