output是sql server2005的新特性.可以從資料修改語句中返回輸出.可以看作是"返回結果的dml".insert,delete,update均支援
output子句.在output子句中,可以引用特殊表inserted和deleted.使用inserted和deleted表與在觸發器中使用的非常相似.
在insert,delete,update中output的區別
1.對於insert,可以引用inserted表以查詢新行的屬性.
2.對於delete,可以引用deleted表以查詢舊行的屬性.
3.對於update,使用deleted表查詢被更新行在更改前的屬性,用inserted表標識被更新行在更改後的值.
輸出方式:
1.可以輸出給呼叫方(客戶端應用程式)
2.輸出給表
3.兩者皆可.
應用:
一.帶有output的insert的應用
對於包含自增列的表執行多行insert語句,同時想知道新的標識值時,在insert中使用output子句非常方便.對於單行insert語句,
這不成問題:scope_identity函式即可實現.
-- generating surrogate keys for customers
use tempdb;
go
if object_id('dbo.customersdim') is not null
drop table dbo.customersdim;
go
create table dbo.customersdim
(
keycol int not null identity primary key,
customerid nchar(5) not null,
companyname nvarchar(40) not null,
/* ... other columns ... */
);
-- insert new customers and get their surrogate keys
declare @newcusts table
(
customerid nchar(5) not null primary key,
keycol int not null unique
);
insert into dbo.customersdim(customerid, companyname)
output inserted.customerid, inserted.keycol
into @newcusts
-- output inserted.customerid, inserted.keycol
select customerid, companyname
from northwind.dbo.customers
where country = n'uk';
select customerid, keycol from @newcusts;
go
注意**中被注釋掉的第二個output子句,後面沒有into子句.如果還要輸出返回給呼叫方,取消注釋即可.這樣,
insert語句將包含兩個output子句.
示例2.
use adventureworks;
go
create table testtable (id int, textval varchar(100))
declare @tmptable table (id int, textval varchar(100))
insert testtable (id, textval)
output inserted.id, inserted.textval into @tmptable
values (1,'firstval')
insert testtable (id, textval)
output inserted.id, inserted.textval into @tmptable
values (2,'secondval')
select * from @tmptable
select * from testtable
drop table testtable
go
use adventureworks;
go
create table testtable (id int, textval varchar(100))
insert testtable (id, textval)
output inserted.id, inserted.textval
values (1,'firstval')
insert testtable (id, textval)
output inserted.id, inserted.textval
values (2,'secondval')
drop table testtable
go
二.帶有output的delete的應用.
如果要刪除資料的同時,還需要記錄日誌,或者歸檔資料.在delete中使用output子句在適合不過了.
use adventureworks;
go
create table testtable (id int, textval varchar(100))
declare @tmptable table (id int, textval varchar(100))
insert testtable (id, textval)
values (1,'firstval')
insert testtable (id, textval)
values (2,'secondval')
delete
from testtable
output deleted.id, deleted.textval into @tmptable
where id in (1,2)
select * from @tmptable
select * from testtable
drop table testtable
go
三.帶有output的update的應用
use adventureworks;
go
create table testtable (id int, textval varchar(100))
declare @tmptable table (id_new int, textval_new varchar(100),id_old int, textval_old varchar(100))
insert testtable (id, textval)
values (1,'firstval')
insert testtable (id, textval)
values (2,'secondval')
update testtable
set textval = 'newvalue'
output inserted.id, inserted.textval, deleted.id, deleted.textval into @tmptable
where id in (1,2)
select * from @tmptable
select * from testtable
drop table testtable
go
儲存過程裡output的使用總結
output的用法 簡單一點說就是帶有output標識的引數在儲存過程中的修改將被儲存。如果不帶,那麼當儲存過程執行結束後,對引數的修改將消失。如果用程式語言來形容的話,就是類似於值傳遞引數與位址傳遞引數一樣的方式。這裡要注意的是如果要設定output,形參和實參要同時設定 實參可以不寫 否則會報以...
使用OUTPUT儲存更新記錄前後資料
年底了,職員都有長薪金的機會,人事部需要做乙份報表,就是顯示薪金前後值的乙份報表。為了實現這樣的功能,使用sql的output功能,即可實現原薪金與新薪金比較的報表。select memberid name salary from dbo member 結果memberid name salary ...
儲存過程裡output的使用總結
output的用法 簡單一點說就是帶有output標識的引數在儲存過程中的修改將被儲存。如果不帶,那麼當儲存過程執行結束後,對引數的修改將消失。如果用程式語言來形容的話,就是類似於值傳遞引數與位址傳遞引數一樣的方式。這裡要注意的是如果要設定output,形參和實參要同時設定 實參可以不寫 否則會報以...