Sql 使用MERGE语句将记录更新/插入到表中

Sql 使用MERGE语句将记录更新/插入到表中,sql,sql-server,delphi,merge,Sql,Sql Server,Delphi,Merge,我在3年前用DB2做过这件事,但不记得是怎么做的 我所要做的就是在表中更新/插入一条记录。我不想测试它是否存在并更改我的DML,而是想用一个参数化的insert/update(merge)T-SQL语句来实现这一点。我相信程序编译器优化器将使这成为最有效的方法 USE [MY_DB] GO /****** Object: Table [dbo].[map_locations] Script Date: 10/11/2015 9:29:26 PM ******/ SET ANSI_NUL

我在3年前用DB2做过这件事,但不记得是怎么做的

我所要做的就是在表中更新/插入一条记录。我不想测试它是否存在并更改我的DML,而是想用一个参数化的insert/update(merge)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 Server 2008或更高版本,并且希望使用其Merge命令(对于此答案的早期版本,我深表歉意)

下面是一个示例Transact-SQL脚本(已测试并运行,但使用我的表结构),它假设您提前知道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的Delphi标记的q在没有提到Sql注入的情况下看起来是完整的,但是使用参数化查询应该可以最大限度地降低这种风险。

没有事务块的
updlock
hint有什么用?@kobik:是的,我想知道当我第一次在Transact-Sql教科书示例c.2000中遇到它时,假设作者假设,如果没有一个显式的事务包装语句,那么它将被包装在一个隐式事务中case@kobik. 谢谢实际上,我意识到我误解了OP的问题,所以我更新了我的答案以使用MERGE命令。同时,在你的评论的提示下,我发现了一些正在测试updlock的东西,我现在还不太明白。如果我想不出来,我会发布我自己的q,并发布链接。@kobik:是的,我也想知道。在更新我的答案之前,我在Sql Server 2014上对其进行了测试:在“更新…”中包含“dest”会引发“dest附近的语法不正确”错误,而忽略它则不会。