Sql 使用MERGE语句将记录更新/插入到表中
我在3年前用DB2做过这件事,但不记得是怎么做的 我所要做的就是在表中更新/插入一条记录。我不想测试它是否存在并更改我的DML,而是想用一个参数化的insert/update(merge)T-SQL语句来实现这一点。我相信程序编译器优化器将使这成为最有效的方法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
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附近的语法不正确”错误,而忽略它则不会。