sql server 2005中的output子句

2021-09-08 20:36:58 字數 2861 閱讀 1179

今天看了下sql server 2005中的output子句,以使您可以從修改語句(insert、update、delete)中將資料返回到表變數中。帶結果的 dml 的有用方案包括清除和存檔、訊息處理應用程式以及其他方案。這一新的 output 子句的語法為:

output into @table_variable
可以通過引用插入的表和刪除的表來訪問被修改的行的舊/新映像,其方式與訪問觸發器類似。在 insert 語句中,只能訪問插入的表。在 delete 語句中,只能訪問刪除的表。在 update 語句中,可以訪問插入的表和刪除的表。下面選用msdn的例子介紹之:

作為帶結果的 dml 可能有用的清除和存檔方案的示例,假設您具有乙個大型的orders表,並且您希望定期清除歷史資料。您還希望將清除的資料複製到乙個名為ordersarchive的存檔表中。您宣告了乙個名為@deletedorders的表變數,並且進入乙個迴圈,在該迴圈中,您使用上文中的「top 增強功能」一節中描述的清除方法,成塊地刪除了歷史資料(比如,早於 2003 年的定單)。這裡增加的**是 output 子句,它將所有被刪除的行的所有屬性複製到@deletedorders表變數中,然後,使用 insert into 語句將該錶變數中的所有行複製到ordersarchive表中:

declare @deletedorders table

(orderid int,

orderdate datetime,

empid int,

custid varchar(5),

qty int

)while 1=1

begin

begin tran

delete top(5000) from orders

output deleted.* into @deletedorders

where orderdate < '20030101'

insert into ordersarchive

select * from @deletedorders

commit tran

delete from @deletedorders

if @@rowcount < 5000

break

end

再舉乙個例子如下,假如有表如下

create table employee

(empid int identity(1, 1)

constraint employee_pk primary key,

firstname varchar(100), 

lastname varchar(100),

*** char(1), 

salutation as case

when *** ='m' then 'mr.'

when *** ='f' then 'ms.'

else '' end,

salary money,

deductions as case

when salary <3000 then .20 * salary

when salary between 30000

and 50000 then .26*salary

when salary between 50001

and 75000 then .30*salary

else .35*salary end,

doj datetime constraint doj_def

default getdate())

}

很容易的乙個表,其中用到了case子句,分別對salutation ,deductions,doj等進行了設定。

而我們可以再搞乙個儲存過程,如下:

create procedure employee_insert

@fname varchar(100),

@lname varchar(100),

@*** char(1),

@salary money

asdeclare @empoutput table (empid int ,firstname varchar(100),

lastname varchar(100),*** char(1), salutation char(3),salary money,

deductions money,doj datetime )

insert into employee(firstname,lastname,salary,***)

output inserted.* into @empoutput

values(@fname ,@lname ,@salary,@***  )

select * from @empoutput

然後在呼叫該儲存過程時,可以這樣來用

use [mydatabase]

goexec employee_insert 'miho','yoshikawa','f',146000

這樣,將在執行的時候,將往employee表裡插入資料,並且,將定義了乙個臨時的變數empoutput,注意哦,這個可以以表的形式定義的,這裡很容易看的出來,並且,將插入到employee表的資料同時輸出到這個empoutput變數中去.我們執行這個儲存過程後,會發現如下結果

empid,firstname,lastname,***,salutation,salary,deductions,doj

7,miho,yoshikawa,f,ms.,146000.00,51100.00,2006-04-09 23:16:44.920

,並且employee表中的確插入了記錄

可以看到

sql server 2005中的output子句

今天看了下sql server 2005中的output子句,以使您可以從修改語句 insert update delete 中將資料返回到表變數中。帶結果的 dml 的有用方案包括清除和存檔 訊息處理應用程式以及其他方案。這一新的 output 子句的語法為 output into table v...

With在sql server 2005中的用法

with在msdn中的講解,可以參考鏈結 1 2 建立錶值變數型別 3 4create type ty newareagoods as table 5 areaid int notnull,6 goodsid int notnull 7 8 9 創鍵返回今天 的資料 10 根據有 的地區獲取參 11...

SQL Server 2005中的T SQL增強D

遞迴的通用表表示式 遞迴的cte是根據至少兩個查詢 或者稱為兩個成員 構建的,乙個是非遞迴查詢,也成為固定成員,只能呼叫一次,另外乙個是遞迴查詢,也成為遞迴成員 rm 可以反覆呼叫,直到查詢不再返回行。查詢由union all運算子連線為乙個單獨的cte。使用遞迴的通用表表示式 gocreate t...