【问题标题】:Update / Insert records to a table with a MERGE Statement使用 MERGE 语句更新/插入记录到表中
【发布时间】:2015-10-12 01:48:35
【问题描述】:

我在 3 年前使用 DB2 做到了这一点,但不记得是如何做到的。

我想要做的就是更新/插入记录到表中。我不想测试它的存在并更改我的 DML,而是想使用参数化的插入/更新(合并)T-SQL 语句来做到这一点。我相信程序编译器优化器将使这成为最有效的方法。

USE [MY_DB]
GO

/****** Object:  Table [dbo].[map_locations]    Script Date: 10/11/2015 9:29:26 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[map_locations](
    [loc_min_lat] [varchar](5) NOT NULL,
    [loc_min_lng] [varchar](6) NOT NULL,
    [loc_id] [int] NULL,
    [center] [varchar](20) NOT NULL CONSTRAINT [DF__map_locs__call___5E4ADDA8]  DEFAULT (''),
 CONSTRAINT [PK__map_map_locs__79C80F94] PRIMARY KEY CLUSTERED 
(
    [map_locations_lat] ASC,
    [map_locations_lng] ASC,
    [center] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

简单地说,如果记录不违反 PK,我希望能够将记录插入到上表中,但如果记录(从 PK 角度)存在则更新它。

我一直在研究,所有的 MS SQL 示例都是针对两个表合并的。我正在通过参数传入一条记录。

我在 Delphi XE10 工作(这不重要),数据库是 MS SQL 2012。

任何帮助表示赞赏。

【问题讨论】:

    标签: sql sql-server delphi merge


    【解决方案1】:

    当您说“而不是”时,我假设您使用的是 Sql Server 2008 或更高版本,并且想要使用它的 Merge 命令(对此答案的早期版本表示歉意)。

    这是一个示例 TransactSql 脚本(经过测试并可以运行,但使用我的表结构),假设您提前知道 PK:

    declare @id int
    
    select @id = 1
    
    merge table1 as dest
    using (values (@id, 'name1'))
        as source (id, name)
        on dest.id = @id
    when matched then
        update 
        set name = source.name
    when not matched then
        insert ( id, name)
        values ( source.id, source.name);
    
    select * from table1
    

    在 Delphi 应用程序中,您希望将其编写为参数化查询,或者更好的是,对服务器上的存储过程进行参数化调用。

    如今,没有提及 Sql-Injection 的 Delphi 标记的关于 Sql 的 q 似乎是完整的,但使用参数化查询应该可以最大限度地降低这种风险。

    【讨论】:

    • updlock提示没有事务块有什么用?
    • @kobik:是的,我想知道当我第一次在 Transact Sql 教科书示例中遇到它时,c.2000,并想象作者假设它会被包装在一个隐式事务中,如果有不是一个明确的包装声明
    • 在这种情况下你需要一笔交易
    • @kobik。谢谢。实际上,我意识到我误解了 OP 的问题,所以我更新了我的答案以使用 MERGE 命令。同时,根据您的评论,我发现了一些我目前不太了解的测试更新锁。如果我想不通,我会发布一个我自己的 q 并发布一个链接。
    • @kobik:是的,我也想知道这一点。在更新我的答案之前,我在 Sql Server 2014 上对其进行了测试:在“update ...”中包含“dest”会引发“'dest'附近的语法不正确”。错误,而忽略它不会。
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2013-02-11
    • 1970-01-01
    • 2021-01-06
    相关资源
    最近更新 更多