动态sql语句,非存储过程,如何判断某条数据是否存在,如果不存在就添加一条

时间:2022-02-08 20:00:04

已知一个表 table

里面有两个字段  A1 和 A2

如何用动态语句 判断 A1 = A , A2=B 的数据是否存在,如果不存在,就添加一条数据, A1 = A , A2 = B

谢谢 

10 个解决方案

#1


[code=sql]INSERT table1 (A1,A2)
SELECT 'A','B'
 WHERE NOT EXISTS (SELECT *
                     FROM table1
                    WHERE A1 = 'A'
                      AND A2 = 'B'
                  )[/code=sql]

#2


if not exists (select 1 from 表table where  A1 = 'A'  and  A2='B')
insert 表table(A1,A2) values('A','B')

#3


A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。

#4



-- 凑个人数

drop table test 
go
create table test (A1 int , A2 int )
go
insert into test(A1 , A2) values(1,2),(3,4)
go
insert into test(A1 , A2) 
select 5 ,6 
except
select A1 , A2  from test where A1 =5 and A2 = 6 
go 2  -- 执行 2 次
select * from test 
go


(2 行受影响)
开始执行循环

(1 行受影响)

(0 行受影响)
批处理执行已完成 2 次。
A1          A2
----------- -----------
1           2
3           4
5           6

(3 行受影响)


#5


我有印象了~
遇到这种避免重复插入的
可以先把要插入的数据都存在临时表里,
插入时加where not exists(...)判断.
这样多进程并发执行也不会插入重复值.
insert into 表([字段列表])
 select [字段列表]
 from [临时表] a
 where not exists(select 1 
                  from 表 b
                  where b.A1=a.A1 AND b.A2=a.A2)

#6


引用 3 楼 u010192842 的回复:
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。


参数可以用 string.format 拼接

#7


引用 6 楼 chilli6519 的回复:
Quote: 引用 3 楼 u010192842 的回复:

A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。


参数可以用 string.format 拼接


1楼的方法,把A和B替换成 string.format 拼的字符串

#8


引用 7 楼 u010192842 的回复:
Quote: 引用 6 楼 chilli6519 的回复:

Quote: 引用 3 楼 u010192842 的回复:

A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。


参数可以用 string.format 拼接


1楼的方法,把A和B替换成 string.format 拼的字符串


一楼的测试了,没有提示错误,但数据没有添加

#9


数据已存在就不添加,这不是你的目的吗!
你把子查询部分执行一下,可以验证的。

#10


把跟出来的语句发一下。

#1


[code=sql]INSERT table1 (A1,A2)
SELECT 'A','B'
 WHERE NOT EXISTS (SELECT *
                     FROM table1
                    WHERE A1 = 'A'
                      AND A2 = 'B'
                  )[/code=sql]

#2


if not exists (select 1 from 表table where  A1 = 'A'  and  A2='B')
insert 表table(A1,A2) values('A','B')

#3


A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。

#4



-- 凑个人数

drop table test 
go
create table test (A1 int , A2 int )
go
insert into test(A1 , A2) values(1,2),(3,4)
go
insert into test(A1 , A2) 
select 5 ,6 
except
select A1 , A2  from test where A1 =5 and A2 = 6 
go 2  -- 执行 2 次
select * from test 
go


(2 行受影响)
开始执行循环

(1 行受影响)

(0 行受影响)
批处理执行已完成 2 次。
A1          A2
----------- -----------
1           2
3           4
5           6

(3 行受影响)


#5


我有印象了~
遇到这种避免重复插入的
可以先把要插入的数据都存在临时表里,
插入时加where not exists(...)判断.
这样多进程并发执行也不会插入重复值.
insert into 表([字段列表])
 select [字段列表]
 from [临时表] a
 where not exists(select 1 
                  from 表 b
                  where b.A1=a.A1 AND b.A2=a.A2)

#6


引用 3 楼 u010192842 的回复:
A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。


参数可以用 string.format 拼接

#7


引用 6 楼 chilli6519 的回复:
Quote: 引用 3 楼 u010192842 的回复:

A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。


参数可以用 string.format 拼接


1楼的方法,把A和B替换成 string.format 拼的字符串

#8


引用 7 楼 u010192842 的回复:
Quote: 引用 6 楼 chilli6519 的回复:

Quote: 引用 3 楼 u010192842 的回复:

A和B是值还是参数呢?
是‘A’和‘B’这样的值的话,1楼可行。
要是参数的话,就得用过程了,或者程序拼语句。


参数可以用 string.format 拼接


1楼的方法,把A和B替换成 string.format 拼的字符串


一楼的测试了,没有提示错误,但数据没有添加

#9


数据已存在就不添加,这不是你的目的吗!
你把子查询部分执行一下,可以验证的。

#10


把跟出来的语句发一下。