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

时间:2015-10-12 01:48:35

标签: sql sql-server delphi merge

我3年前用DB2做过这个但是不记得怎么做了。

我想要做的就是更新/将记录插入表中。我想用参数化的插入/更新(合并)T-SQL语句来测试它的存在并改变我的DML,而不是测试它的存在。我相信程序编译器优化器将使这成为最有效的方法。

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。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

当你说"而不是"时,我假设你正在使用Sql Server 2008或更高版本并且想要使用它的Merge命令(对于这个答案的早期版本道歉)。

这是一个示例TransactSql脚本(经过测试和使用,但使用我的表结构),它假定您事先知道PK:

function prev() {
var click_lf = 0;
var click_dsb_lf = 0;


$('.sl-lft').on('click', function () {

    var curr = parseInt($('.active-thumb').children('span').text().charAt(0));
    click_lf += 1;
    click_dsb_lf += 1;

    if (click_dsb_lf <= 1) {
        sc_right.removeClass('sl-lft-off').addClass('sl-lft').on('click'); // here is a problem
        sc_left.removeClass('sl-lft').addClass('sl-lft-off').off('click');
        // console.log('event');
        console.log(click_dsb_lf);

    }

    if (click_lf == 3 || curr < 3) {
        thmbs_wrp.animate({scrollTop: '-=' + '149px'}, 500);
        click_lf = 0;
    }


});

从Delphi应用程序中,您希望将其编写为参数化查询,或者更好的是,对服务器上的存储过程进行参数化调用。

现在,没有提及Sql-Injection的情况下,没有关于Sql的Delphi标记q似乎完整,但使用参数化查询应该将风险降至最低。