sql server 2005中的output子句

2021-06-15 05:34:57 字數 2861 閱讀 7791

今天看了下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表中的確插入了記錄

可以看到

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中的output子句

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

SQL Server 2005中的T SQL增強D

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