我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。
任何帮助表示感谢。
答案 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似乎完整,但使用参数化查询应该将风险降至最低。