sql根据条件判断是否插入数据

小栗子不乖 2018-12-19 04:27:54
A表,执行insert语句时,会根据B表里的一个值的状态来判断是否执行这次新增,何解
...全文
955 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hgwyl 2018-12-25
  • 打赏
  • 举报
回复
if B表条件=1
begin
执行A表添加
end
wwfxgm 2018-12-23
  • 打赏
  • 举报
回复
膜拜一下。大神各种语句随便用。真是太灵活了。
morliz子轩 2018-12-21
  • 打赏
  • 举报
回复
膜拜大神的思路,很清晰。受用了
快乐起航2020 2018-12-21
  • 打赏
  • 举报
回复
先把B表 符合条件的都删除,然后统一添加
吉普赛的歌 版主 2018-12-19
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
GO
CREATE TABLE A(
    aId INT PRIMARY KEY,
    aname NVARCHAR(10)   
)
GO
CREATE TABLE B(
    id INT IDENTITY(1,1) PRIMARY KEY,
    aId INT NOT NULL,
    bname NVARCHAR(10)   
)
GO
SET NOCOUNT ON
INSERT INTO B (aId,bName) VALUES (1,'bb');
----- 以上为测试表及测试数据 -------
GO


--------- 创建存储过程 -------------
IF OBJECT_ID('Proc_InsertIntoA') IS NOT NULL
	DROP PROC Proc_InsertIntoA
GO
-- =============================================
-- Author:		ye
-- Create date: 2018-12-19
-- Description:	插入到 A 表,如果不满足条件则不插入
-- =============================================
CREATE PROCEDURE Proc_InsertIntoA
	@aId INT,
	@aname NVARCHAR(10)
AS
BEGIN
	SET NOCOUNT ON;
	IF NOT EXISTS(SELECT 1 FROM b WHERE b.aId=@aId)
    BEGIN
        RAISERROR('B 表不存在插入记录的对应 aId,则不允许插入',16,1)
        RETURN;
    END
	
	INSERT INTO A(aId,aname) VALUES (@aId,@aname);
END
GO


--测试插入
--B中存在 aId=1 的记录,允许
EXEC Proc_InsertIntoA @aId=1, @aname='a1';
GO
--B中不存在 aId=2 记录,不允许
EXEC Proc_InsertIntoA @aId=2, @aname='a2';
/*
消息 50000,级别 16,状态 1,过程 Proc_InsertIntoA,行 14 [批起始行 52]
B 表不存在插入记录的对应 aId,则不允许插入
*/

--检查 A 表插入了哪些记录,符合预期
SELECT * FROM A
/*
aId         aname
----------- ----------
1           a1
*/
你用存储过程, 仿照我上面的写法就是了。 但是, 选择用存储过程而不用触发器, 则你只能用存储过程来插入, 用语句就会有问题了。 这个要在使用时比较注意。,
小栗子不乖 2018-12-19
  • 打赏
  • 举报
回复
引用 5 楼 吉普赛的歌 的回复:
[quote=引用 4 楼 qq_34403916 的回复:]
你写的太专业了,我表示不懂


就是在 A 表上加一个触发器, 如果发现与你预期的条件不符合, 就回滚事务, 这种不合条件记录就无法插入了。[/quote]
我是要用存储过程这个功能解决,但是我不会,所以存储过程能解决这个问题吗?
小栗子不乖 2018-12-19
  • 打赏
  • 举报
回复
就是在 A 表上加一个触发器, 如果发现与你预期的条件不符合, 就回滚事务, 这种不合条件记录就无法插入了。[/quote]我是要用存储过程功能解决,但是我不会,所以存储过程能解决吗?
吉普赛的歌 版主 2018-12-19
  • 打赏
  • 举报
回复
引用 4 楼 qq_34403916 的回复:
你写的太专业了,我表示不懂
就是在 A 表上加一个触发器, 如果发现与你预期的条件不符合, 就回滚事务, 这种不合条件记录就无法插入了。
小栗子不乖 2018-12-19
  • 打赏
  • 举报
回复
引用 3 楼 吉普赛的歌 的回复:
USE tempdb
GO
IF OBJECT_ID('trig_A_I') IS NOT NULL DROP TRIGGER trig_A_I
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
GO
CREATE TABLE A(
aId INT PRIMARY KEY,
aname NVARCHAR(10)
)
GO
CREATE TABLE B(
id INT IDENTITY(1,1) PRIMARY KEY,
aId INT NOT NULL,
bname NVARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT INTO B (aId,bName) VALUES (1,'bb');

GO
-- =============================================
-- Author: ye
-- Create date: 2018-12-19
-- Description: 如果 B 表不存在插入记录的对应 aId,则不允许插入。
-- =============================================
CREATE TRIGGER dbo.trig_A_I
ON dbo.A
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS(SELECT 1 FROM INSERTED AS x LEFT JOIN b AS y ON x.aId=y.aId WHERE y.aId IS NULL)
BEGIN
RAISERROR('B 表不存在插入记录的对应 aId,则不允许插入',16,1)
ROLLBACK TRAN;
END
END
GO

INSERT INTO A(aid,aname) VALUES(1,'a1');
GO
INSERT INTO A(aid,aname) VALUES(2,'a2');
/*
消息 50000,级别 16,状态 1,过程 trig_A_I,行 14 [批起始行 42]
B 表不存在插入记录的对应 aId,则不允许插入
消息 3609,级别 16,状态 1,第 43 行
事务在触发器中结束。批处理已中止。
*/

SELECT * FROM A
/*
aId aname
1 a1
*/


类似这样处理就好了

你写的太专业了,我表示不懂
吉普赛的歌 版主 2018-12-19
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('trig_A_I') IS NOT NULL DROP TRIGGER trig_A_I
IF OBJECT_ID('A') IS NOT NULL DROP TABLE A
IF OBJECT_ID('B') IS NOT NULL DROP TABLE B
GO
CREATE TABLE A(
	aId INT PRIMARY KEY,
	aname NVARCHAR(10)	
)
GO
CREATE TABLE B(
	id INT IDENTITY(1,1) PRIMARY KEY,
	aId INT NOT NULL,
	bname NVARCHAR(10)	
)
GO
SET NOCOUNT ON
INSERT INTO B (aId,bName) VALUES (1,'bb');

GO
-- =============================================
-- Author:		ye
-- Create date: 2018-12-19
-- Description:	如果 B 表不存在插入记录的对应 aId,则不允许插入。
-- =============================================
CREATE TRIGGER dbo.trig_A_I 
   ON  dbo.A 
   AFTER INSERT
AS 
BEGIN
	SET NOCOUNT ON;
	IF EXISTS(SELECT 1 FROM INSERTED AS x LEFT JOIN b AS y ON x.aId=y.aId WHERE y.aId IS NULL)
	BEGIN
		RAISERROR('B 表不存在插入记录的对应 aId,则不允许插入',16,1)
		ROLLBACK TRAN;
	END
END
GO

INSERT INTO A(aid,aname) VALUES(1,'a1');
GO
INSERT INTO A(aid,aname) VALUES(2,'a2');
/*
消息 50000,级别 16,状态 1,过程 trig_A_I,行 14 [批起始行 42]
B 表不存在插入记录的对应 aId,则不允许插入
消息 3609,级别 16,状态 1,第 43 行
事务在触发器中结束。批处理已中止。
 */
 
 SELECT * FROM A
/*
aId	aname
1	a1
*/
类似这样处理就好了
Dear SQL(燊) 2018-12-19
  • 打赏
  • 举报
回复
if exists(select * from b where 字段='值') begin insert into a end
「已注销」 2018-12-19
  • 打赏
  • 举报
回复
insert into inner join

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧