gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:18:57 25 4
gpt4 key购买 nike

我在 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 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 应用程序中,您希望将其编写为参数化查询,或者更好的是,对服务器上存储的 proc 的参数化调用。

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

关于sql - 使用 MERGE 语句将记录更新/插入到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33072093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com