SQL 触发器

朕即天下 2012-10-22 11:32:53
SQL 触发器:
求一个SQL触发器:
功能描述: 数据库中有A表和B表,希望实现A表中的A列里面的值与B表B列里面的值做前2位的数值比较,结果如果相等,则改写A表中B列的值,不等不用改。
...全文
285 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
汤姆克鲁斯 2012-10-23
  • 打赏
  • 举报
回复
BOM_083 和BOM_027 也是通过CTYPEID关联的吧
汤姆克鲁斯 2012-10-23
  • 打赏
  • 举报
回复
create trigger tt on BOM_027
for insert,update
as
begin
if exists(select 1 from test_jiekou as b ,inserted as i where left(b.testweiyiid,2)=left(i.PARTID,2))
update a set PARTFIXEDBACK3=b.CTYPEID
from BOM_027 as a
join inserted as i on a.CTYPEID=i.CTYPEID
join BOM_083 as b on a.CTYPEID=b.PARTID
end
朕即天下 2012-10-23
  • 打赏
  • 举报
回复
我的意思是:
当表BOM_027的列PARTID中的值前2位与表test_jiekou的列testweiyiid中的值前2位相等时候,就把表BOM_083的列CTYPEID的值赋值给表BOM_027的列PARTFIXEDBACK3。
换句话说:就是每当表BOM_027中增加一条记录,数据库会比较一下:“表BOM_027的列PARTID中的值前2位与表test_jiekou的列testweiyiid中的值前2位相等”是否相等。相等就把:“表BOM_083的列CTYPEID的值赋值给表BOM_027的列PARTFIXEDBACK3”。
汤姆克鲁斯 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

问题重新描述一下:谢谢各位!
第一张表:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[BOM_083](
[CTYPEID] [varchar](50) NOT NULL,
[CPARENTID] [varchar](50) NOT NU……
[/Quote]
你的意思是什么?
朕即天下 2012-10-23
  • 打赏
  • 举报
回复
问题重新描述一下:谢谢各位!
第一张表:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[BOM_083](
[CTYPEID] [varchar](50) NOT NULL,
[CPARENTID] [varchar](50) NOT NULL,
[CTYPENAME] [varchar](100) NOT NULL,
[CTYPEKEY] [varchar](50) NOT NULL,
[CISCHILD] [varchar](50) NULL,
[CHILDLENGTH] [varchar](50) NULL,
[CFLOWSTART] [varchar](50) NULL,
[CFLOWLENGTH] [varchar](50) NULL,
[CJCTYPEKEYID] [varchar](100) NOT NULL,
[CTYPEBACKUP1] [varchar](100) NULL,
[CTYPEBACKUP2] [varchar](100) NULL,
[CTYPEBACKUP3] [varchar](100) NULL,
[RULEID] [int] NULL CONSTRAINT [DF_BOM_083_RULEID] DEFAULT ((-1)),
[typerole] [varchar](1000) NULL,
CONSTRAINT [PK_BOM_083] PRIMARY KEY CLUSTERED
(
[CTYPEID] 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

第二张表:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[test_jiekou](
[testname] [varchar](100) NOT NULL,
[testweiyiid] [varchar](100) NOT NULL,
CONSTRAINT [PK_test_jiekou] PRIMARY KEY CLUSTERED
(
[testname] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

第三张表:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[BOM_027](
[PARTID] [varchar](100) NOT NULL,
[PARTVAR] [varchar](100) NOT NULL,
[KIND] [varchar](100) NULL CONSTRAINT [DF_BOM_027_KIND] DEFAULT ('零件'),
[SOURCE] [varchar](100) NULL CONSTRAINT [DF_BOM_027_SOURCE] DEFAULT ('自制件'),
[KEYIMPORTANT] [varchar](100) NULL CONSTRAINT [DF_BOM_027_KEYIMPORTANT] DEFAULT ('不是'),
[MATERIAL] [varchar](100) NULL,
[WEIGHT] [varchar](100) NULL,
[COSTPRICE] [varchar](200) NULL,
[ARCHIVESTATE] [varchar](100) NULL,
[CHINADGREE] [varchar](100) NULL,
[CHINANAME] [nvarchar](200) NULL,
[COUNTS] [varchar](100) NULL CONSTRAINT [DF_BOM_027_COUNTS] DEFAULT (1),
[ENGLISHNAME] [varchar](100) NULL,
[SPECIALITYOFFICE] [varchar](100) NULL,
[COMPAREPART] [varchar](3000) NULL,
[FOREIGNPARTID] [varchar](100) NULL,
[ORIGINALFIGID] [varchar](100) NULL,
[STANDARDFIGID] [varchar](100) NULL,
[DESIGNDATE] [varchar](50) NULL,
[CHECKER] [varchar](100) NULL,
[AUDITOR] [varchar](100) NULL,
[PROCESSCHECKER] [varchar](100) NULL,
[CRITERION] [varchar](100) NULL,
[AFFIRMANT] [varchar](100) NULL,
[AFFIRMDATE] [varchar](50) NULL,
[FIGDIMENSION] [varchar](100) NULL,
[SCALE] [varchar](100) NULL,
[FIGMARK] [varchar](100) NULL,
[CODER] [varchar](100) NULL,
[CODEDATE] [varchar](50) NULL,
[CODESTATE] [varchar](100) NULL,
[MATUREDEGREE] [varchar](100) NULL,
[VALIDATETIME] [varchar](50) NULL,
[INVALIDATETIME] [varchar](50) NULL,
[FUNCTIONID] [varchar](50) NULL,
[PARTFIXEDBACK1] [varchar](100) NULL,
[PARTFIXEDBACK2] [varchar](3000) NULL,
[PARTFIXEDBACK3] [varchar](100) NULL,
[PARTFIXEDBACK4] [varchar](100) NULL CONSTRAINT [DF_BOM_027_PARTFIXEDBACK4] DEFAULT ('1'),
[PARTFIXEDBACK5] [varchar](100) NULL,
[SPEC] [varchar](200) NULL,
[MODEL] [nvarchar](200) NULL,
[PARTPICFTPNAME] [varchar](500) NULL,
[ENGNAME] [varchar](100) NULL,
[PARTSTATE] [varchar](50) NULL,
[PRODUCTKIND] [varchar](50) NULL,
[CITATIONCOUNT] [int] NULL DEFAULT (0)
) ON [PRIMARY]
SET ANSI_PADDING OFF
ALTER TABLE [dbo].[BOM_027] ADD [INPUTERP] [char](1) NOT NULL DEFAULT ('0')
SET ANSI_PADDING ON
ALTER TABLE [dbo].[BOM_027] ADD [control] [varchar](100) NULL
ALTER TABLE [dbo].[BOM_027] ADD [comefrom] [varchar](100) NULL
ALTER TABLE [dbo].[BOM_027] ADD [SERIESNAME] [varchar](100) NULL
ALTER TABLE [dbo].[BOM_027] ADD [ERPInventoryCode] [varchar](200) NULL
/****** 对象: Index [PK_PARTFIXED] 脚本日期: 10/23/2012 11:11:04 ******/
ALTER TABLE [dbo].[BOM_027] ADD CONSTRAINT [PK_PARTFIXED] PRIMARY KEY CLUSTERED
(
[PARTID] ASC,
[PARTVAR] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

我的意思是:
汤姆克鲁斯 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

消息 207,级别 16,状态 1,过程 tt,第 8 行
列名 'CTYPEID' 无效。
消息 207,级别 16,状态 1,过程 tt,第 8 行
列名 'CTYPEID' 无效。
消息 207,级别 16,状态 1,过程 tt,第 9 行
列名 'CTYPEID' 无效。
消息 207,级别 16,状态 1,过程 tt,第 9 行
列名 'PARTID' 无效。
[/Quote]
你自己修改一下关联的表条件吧 我可能弄错了
朕即天下 2012-10-23
  • 打赏
  • 举报
回复
消息 207,级别 16,状态 1,过程 tt,第 8 行
列名 'CTYPEID' 无效。
消息 207,级别 16,状态 1,过程 tt,第 8 行
列名 'CTYPEID' 无效。
消息 207,级别 16,状态 1,过程 tt,第 9 行
列名 'CTYPEID' 无效。
消息 207,级别 16,状态 1,过程 tt,第 9 行
列名 'PARTID' 无效。
朕即天下 2012-10-23
  • 打赏
  • 举报
回复
谢谢你,我来测试一下。
發糞塗牆 2012-10-22
  • 打赏
  • 举报
回复
1、开启连接服务器访问。
2、用3楼的。
dodolzc10 2012-10-22
  • 打赏
  • 举报
回复
如果只是不想那两列出现相同值,直接约束就好了.
人生无悔 2012-10-22
  • 打赏
  • 举报
回复

create trigger b_insupd
on B
for insert,update
as
begin
update A set B=i.B from inserted i
where left(A.A,2)=left(i.B,2);
end
go
  • 打赏
  • 举报
回复
这个需求不用触发器。

update a
set b=b.b
from a join b on a=left(b,2)
开启时代 2012-10-22
  • 打赏
  • 举报
回复
create trigger Trig_TEST
on B
after insert
as
....


最好贴出表结构,和比较时 的关联字段。
朕即天下 2012-10-22
  • 打赏
  • 举报
回复
触发器肯定要,那张表随时都会有数据插入,插入一条比较一条,然后修改一条。
汤姆克鲁斯 2012-10-22
  • 打赏
  • 举报
回复
我认真看了三遍 也没发现楼主要在按个表上建立触发器。
以学习为目的 2012-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这个需求不用触发器。

update a
set b=b.b
from a join b on a=left(b,2)
[/Quote]这个写法很好。


用触发器的话,支持3楼

34,594

社区成员

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

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