sql-server - 如何避免数据重复插入?

标签 sql-server node.js excel openrowset node-mssql

最近我发布了一个question ,它包含一些语法错误,现在代码运行没有错误,感谢@Arulkumar。

但现在我又面临一个问题,Excel 工作表中的数据已正确存储到 SQL Server 数据库中,但是当我按下刷新按钮或在应用程序中再次访问该链接时,数据会在数据库中重复。再次意味着它从 Excel 中检索值并将相同的数据再次存储在数据库中。

如何避免数据重复。有人可以帮我解决这个问题吗?代码和 Excel 工作表示例位于上述链接中。

最佳答案

您需要 MERGE 语句

request.query('MERGE [mytable] as target USING (SELECT SalesPersonID, TerritoryID FROM OPENROWSET('  + 
        '\'Microsoft.ACE.OLEDB.12.0\', \'Excel 12.0;Database=D:\\sample\\test\\data\\1540_OPENROWSET_Examples.xls;HDR=YES\', ' + 
        '\'SELECT SalesPersonID, TerritoryID FROM [SELECT_Example$]\')' +
        ' ) as source' +
        ' ON target.SalesPersonID = source.SalesPersonID' +
        ' WHEN MATCHED THEN UPDATE SET TerritoryID = source.TerritoryID' +
        ' WHEN NOT MATCHED THEN INSERT (SalesPersonID, TerritoryID) VALUES (source.SalesPersonID, source.TerritoryID);'
        ,function(err,recordset){
    if(err) console.log(err)

如果已经存在具有相同 SalesPersonID 的行,它将更新 TerritoryID;如果 mytable 中没有匹配项,它将插入行。

如果您需要在两个字段上加入,请更改此:

ON target.SalesPersonID = source.SalesPersonID

关于这一点:

ON target.SalesPersonID = source.SalesPersonID AND target.TerritoryID = source.TerritoryID

之后 - 删除该字符串,因为它不再需要:

'WHEN MATCHED THEN UPDATE SET TerritoryID = source.TerritoryID' + 

关于sql-server - 如何避免数据重复插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37154757/

相关文章:

java - 验证连接的数据库 - Java 持久性 API

sql - 是否有一个程序可以显示现有数据库中的 SQL 模式图?

json - 即使从 package.json 中删除它,node-gyp 也会尝试建立依赖关系

javascript - Jest 覆盖率测试报告的准确性如何? Jest 测试覆盖率是如何计算的?我应该如何分析覆盖率结果?

c# - 使用 EEPlus 读取 Excel 文件时,Excel 日期字段值与 C# dateTime 相差 1 天

sql-server - 定义 View 时如何让 T-SQL 执行 OPTION (FORCE ORDER)?

c# - 尝试将 SQL 查询的值获取到字符串中

mysql - 在 Sequelize 中创建主键和外键关系

html - 在vba selenium中循环没有id的无序列表

excel - 如何根据另一个单元格中的数据在 Excel 中创建 URL?