• 全部
  • 基础类
  • 应用实例
  • 新技术前沿

高分请教一个SQL语句

Heray 2003-02-17 11:38:23
有两个表A,B
表A字段有A1,A2,K, 其中K是关键字,自动增加整型,表B有若干个字段,其中有外键K与表A关联。
已知a1,a2,现在要在表A中插入一条记录,使A1=a1,A2=a2,并要求在插入的同时在表B中插入相应的记录,使得B.K=A.K(表B的其它字段使用默认值)
请问如何写SQL语句来完成这样一个功能?
...全文
47 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Heray 2003-02-17
我知道可以使用触发器,但我想知道如何写SQL语句来实现这样的功能?
回复
BlackPoint 2003-02-17
使用触发器。
回复
Heray 2003-02-17
哦,错了,补充一下,表A中还有个时间型字段InsertTime,为插入记录时的时间
回复
cdshelf 2003-02-17
也可以用 SCOPE_IDENTITY 代替 @K
回复
cdshelf 2003-02-17
抱歉,我搞错了,应该是:

触发器
CREATE TRIGGER tgInsertA ON dbo.A
FOR INSERT
AS

DECLARE @K INT
SET @K=(Select K From Inserted)
Insert Into B (K,...) Values (@K,...)

注意, @@IDENTITY 并不一定返回准确的值,如果A表还有另外的触发器,并且另外的触发器也涉及到 IDENTITY 生成的话。

Select K From Inserted 可以保证返回的就是刚刚生成的 IDENTITY
回复
pengdali 2003-02-17
declare @max int
begin tran
select @max=isnull(max(k),0)+1 from 表A
insert 表A values (@max,A1,A2,getDate())
insert 表B (K,其他字段) values(@max,其他字段的值)
commit tran
回复
Heray 2003-02-17
嗯,谢谢楼上
不过我想知道为什么使用上面所说的触发器会出错
回复
一条语句不可能完成插入两个表的工作。
两条插入语句放到一个事务中来执行,可以避免数据冲突的发生。
回复
Heray 2003-02-17
cdshelf兄似乎也不大对,我按你的办法回出错,提示
Subqueries are not allowed in this context.Only scalar expressions are allowed
回复
edarw 2003-02-17
@@identity是当前会话最后插入identity列的值,也就是插入A表中的K。
回复
Heray 2003-02-17
但我希望用一条Select语句完成,否则的话有可能出现在执行两个语句之间,有其它客户端改变数据库记录的情况,虽然这是小概率事件,但也应该去避免
回复
Heray 2003-02-17
不好意思,是我理解错了,谢谢pengdali
回复
Heray 2003-02-17
楼上的似乎不对吧?
表B中的K不是自动增长型的字段
回复
pengdali 2003-02-17
begin tran
insert 表A (A1,A2,你的时间字段) values(@a1,@a2,getDate())
insert 表B (K,其他字段) values(@@IDENTITY,其他字段的值)
commit tran
回复
pengdali 2003-02-17
begin tran
insert 表A (A1,A2) values(@a1,@a2,getDate())
insert 表B (K,.....) values(@@IDENTITY,其他字段)
commit tran
回复
cdshelf 2003-02-17
Insert Into A (A1,A2) values (a1,a2)

触发器
CREATE TRIGGER tgInsertA ON dbo.A
FOR INSERT
AS
Insert Into B (K,...) Values ((select K from inserted),...)
回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2003-02-17 11:38
社区公告
暂无公告