[英]Update / Insert records to a table with a MERGE Statement
我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命令(對於此答案的早期版本表示歉意)。
這是一個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的德爾福標記的關於Sql的q似乎是完整的,但是使用參數化查詢應該可以最大程度地降低這種風險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.