今天看了下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
然後在呼叫該儲存過程時,可以這樣來用goexec employee_insert 'miho','yoshikawa','f',146000use [mydatabase]
這樣,將在執行的時候,將往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...