------------------------------------ -- Author: happyflsytone -- Date:2008-10-02 16:39:39 ------------------------------------ CREATE TABLE TA( scrapreasonid INT IDENTITY PRIMARY KEY, [name] VARCHAR(50), modifieddate DATETIME ) ; CREATE TABLE TB( ID INT REFERENCES TA(SCRAPREASONID), [name] VARCHAR(50), MODIFIEDDATE DATETIME ); GO CREATE TRIGGER TR_INSERT ON TA INSTEAD OF INSERT AS BEGIN --接受标识列值的表变量 DECLARE @MyTableVar TABLE( ID INT, [NAME] VARCHAR(10), ModifiedDate DATETIME); INSERT TA OUTPUT INSERTED.scrapreasonid,INSERTED.[NAME],INSERTED.ModifiedDate INTO @MyTableVar SELECT [name],modifieddate FROM INSERTED INSERT INTO TB SELECT * FROM @MyTableVar END GO --模拟插入数据 INSERT TA SELECT 'TEST',GETDATE(); INSERT TA SELECT 'TEST2',GETDATE(); --查看记录的标识列数据 SELECT * FROM TB; /* ID name MODIFIEDDATE ----------- -------------------------------------------------- ----------------------- 1 TEST 2008-10-02 17:53:46.780 2 TEST2 2008-10-02 17:53:46.870 (2 行受影响) */ DROP TABLE TB,TA; 最后说明一下使用OUTPUT子句的注意事项: 以下语句中不支持 OUTPUT 子句: 1、引用本地分区视图、分布式分区视图或远程表的 DML 语句。 2、包含 EXECUTE 语句的 INSERT 语句。 3、不能将 OUTPUT INTO 子句插入视图或行集函数。 4、参数或变量作为 UPDATE 语句的一部分进行了修改,则 OUTPUT 子句将始终返回语句执行之前的参数或变量的值而不是已修改的值
插入之前先清空临时表.用触发器吧,把数据放到某个变量或表中. 大致方法如下: 临时表为tb(myGUID) create trigger my_trig on A for insert as being delete from tb insert into tb select GUID from inserted end go
但是注意上面介绍的OUTPUT语句只能在SQL2005中使用
INSERT INTO A([NAME]) OUTPUT INSERTED.[ID] VALUES('XX')
--------------------------------------------- --> Author : js_szy --> Target : 各位大大,小卒就是想要一朵花 --> Date : 2009-11-30 16:34:29 --> Version: SQL Server 2005 ---------------------------------------------
--> 测试数据: @tb declare @tb table (id int identity(1,1),name varchar(20)) -------->SQL 2000 insert into @tb select 'a' select id=@@identity /* id --------------------------------------- 1(1 行受影响) */ ------->SQL 2005insert @tb output inserted.id select 'b'id ----------- 2(1 行受影响)
你们给的这些怎么把它插入到B表的GUID字段
改写这个表的定义和对表的Insert方法CREATE PROC dbo.表名_Insert @ID UNIQUEIDENTIFIER OUTPUT, @其他项目1, @其他项目2 AS SET @ID = NEWID() INSERT INTO dbo.表名( ID, 其他项目1, 其他项目2 ) VALUES ( @ID, @其他项目1, @其他项目2 ) RETURN @@ERROR 表的定义里面的ID就可以不用GUID定义了,以后的插入操作都用上面的存储过程代替 存储过程的返回值就是刚生成的GUID
大致方法如下:
临时表为tb(myGUID)
create trigger my_trig on A for insert
as
insert into tb select GUID from inserted
go
参考老大的3、标识列或计算列方面的应用
对于标识列我们可能通过@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 几个相似的函数获得,他们都返回插入到表的 IDENTITY 列的最后一个值(本身这几个函数还是有差异的,主要是它们的作用域,请查联机帮助)。我们注意到它们只是返回最后一个值,对于批量时就无能无力了。对于实时并发多的系统时我们可以利用OUTPUT_CLAUSE语句把标识列的值提取出来。
------------------------------------
-- Author: happyflsytone
-- Date:2008-10-02 16:39:39
------------------------------------
CREATE TABLE ScrapReason(scrapreasonid INT IDENTITY,[name] VARCHAR(50),modifieddate DATETIME)
;
--接受标识列值的表变量
DECLARE @MyTableVar TABLE( ScrapReasonID SMALLINT,
Name VARCHAR(50),
ModifiedDate DATETIME);
--模拟插入数据
INSERT ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
SELECT N'Operator IDENTITY', GETDATE()
FROM sys.objects ; --查看记录的标识列数据
SELECT ScrapReasonID, Name, ModifiedDate FROM @MyTableVar; GO
drop table ScrapReason;
/*
ScrapReasonID Name ModifiedDate
------------- -------------------------------------------------- -----------------------
1 Operator IDENTITY 2008-10-02 17:42:19.000
2 Operator IDENTITY 2008-10-02 17:42:19.000
3 Operator IDENTITY 2008-10-02 17:42:19.000
4 Operator IDENTITY 2008-10-02 17:42:19.000
5 Operator IDENTITY 2008-10-02 17:42:19.000
6 Operator IDENTITY 2008-10-02 17:42:19.000
.....
.....
62 Operator IDENTITY 2008-10-02 17:42:19.000
63 Operator IDENTITY 2008-10-02 17:42:19.000 (63 行受影响) */
下面我们再来看看触发器使用OUTPUT_CLAUSE的情况,
------------------------------------
-- Author: happyflsytone
-- Date:2008-10-02 16:39:39
------------------------------------
CREATE TABLE TA(
scrapreasonid INT IDENTITY PRIMARY KEY,
[name] VARCHAR(50),
modifieddate DATETIME
)
;
CREATE TABLE TB(
ID INT REFERENCES TA(SCRAPREASONID),
[name] VARCHAR(50),
MODIFIEDDATE DATETIME
);
GO
CREATE TRIGGER TR_INSERT
ON TA
INSTEAD OF INSERT
AS
BEGIN
--接受标识列值的表变量
DECLARE @MyTableVar TABLE( ID INT,
[NAME] VARCHAR(10),
ModifiedDate DATETIME);
INSERT TA
OUTPUT INSERTED.scrapreasonid,INSERTED.[NAME],INSERTED.ModifiedDate
INTO @MyTableVar
SELECT [name],modifieddate FROM INSERTED
INSERT INTO TB SELECT * FROM @MyTableVar
END
GO --模拟插入数据
INSERT TA SELECT 'TEST',GETDATE();
INSERT TA SELECT 'TEST2',GETDATE(); --查看记录的标识列数据
SELECT * FROM TB;
/*
ID name MODIFIEDDATE
----------- -------------------------------------------------- -----------------------
1 TEST 2008-10-02 17:53:46.780
2 TEST2 2008-10-02 17:53:46.870 (2 行受影响) */
DROP TABLE TB,TA;
最后说明一下使用OUTPUT子句的注意事项:
以下语句中不支持 OUTPUT 子句: 1、引用本地分区视图、分布式分区视图或远程表的 DML 语句。
2、包含 EXECUTE 语句的 INSERT 语句。
3、不能将 OUTPUT INTO 子句插入视图或行集函数。
4、参数或变量作为 UPDATE 语句的一部分进行了修改,则 OUTPUT 子句将始终返回语句执行之前的参数或变量的值而不是已修改的值
大致方法如下:
临时表为tb(myGUID)
create trigger my_trig on A for insert
as
being
delete from tb
insert into tb select GUID from inserted
end
go
OUTPUT INSERTED.[ID]
VALUES('XX')
--> Author : js_szy
--> Target : 各位大大,小卒就是想要一朵花
--> Date : 2009-11-30 16:34:29
--> Version: SQL Server 2005
---------------------------------------------
--> 测试数据: @tb
declare @tb table (id int identity(1,1),name varchar(20)) -------->SQL 2000
insert into @tb select 'a' select id=@@identity
/*
id
---------------------------------------
1(1 行受影响)
*/
------->SQL 2005insert @tb
output
inserted.id
select 'b'id
-----------
2(1 行受影响)
@ID UNIQUEIDENTIFIER OUTPUT,
@其他项目1,
@其他项目2
AS
SET @ID = NEWID()
INSERT INTO dbo.表名(
ID,
其他项目1,
其他项目2
)
VALUES
(
@ID,
@其他项目1,
@其他项目2
)
RETURN @@ERROR
表的定义里面的ID就可以不用GUID定义了,以后的插入操作都用上面的存储过程代替
存储过程的返回值就是刚生成的GUID
(urdoom)那怎么接收你的这个过程的返回值,给个例子,比如把返回值插入另外一个表的Guid字段
--select * from tb
create table tb (key_id nvarchar(10),length int,atype nvarchar(10))
declare @a table(key_id nvarchar(10),length int,atype nvarchar(10))
insert into tb
output inserted.key_Id,
inserted.length,
inserted.atype
into @a
select 'jia',50,'china'
select * from @a
go
drop table tb/*(1 行受影响)
key_id length atype
---------- ----------- ----------
jia 50 china(1 行受影响)
*/