簡體   English   中英

使用MERGE語句將記錄更新/插入到表中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM