SQL Server 中的output子句可以使你從修改語句(INSERTUPDATEDELETE)中將數據返回到表變量中帶結果的 DML 的有用方案包括清除和存檔消息處理應用程序以及其他方案這一新的 OUTPUT 子句的語法為
OUTPUT INTO @table_variable
可以通過引用插入的表和刪除的表來訪問被修改的行的舊/新映像其方式與訪問觸發器類似在 INSERT 語句中只能訪問插入的表在 DELETE 語句中只能訪問刪除的表在 UPDATE 語句中可以訪問插入的表和刪除的表下面選用MSDN的例子介紹之
作為帶結果的 DML 可能有用的清除和存檔方案的示例假設你具有一個大型的 Orders 表並且希望定期清除歷史數據你還希望將清除的數據復制到一個名為 OrdersArchive 的存檔表中你聲明了一個名為 @DeletedOrders 的表變量並且進入一個循環在該循環中你使用上文中的TOP 增強功能一節中描述的清除方法成塊地刪除了歷史數據(比如早於 年的定單)這裡增加的代碼是 OUTPUT 子句它將所有被刪除的行的所有屬性復制到 @DeletedOrders 表變量中然後使用 INSERT INTO 語句將該表變量中的所有行復制到 OrdersArchive 表中
DECLARE @DeletedOrders TABLE
(
orderid INT
orderdate DATETIME
empid INT
custid VARCHAR()
qty INT
)
WHILE =
BEGIN
BEGIN TRAN
DELETE TOP() FROM Orders
OUTPUT deleted* INTO @DeletedOrders
WHERE orderdate <
INSERT INTO OrdersArchive
SELECT * FROM @DeletedOrders
COMMIT TRAN
DELETE FROM @DeletedOrders
IF @@rowcount <
BREAK
END
再舉一個例子如下假如有表如下
Create table Employee(EmpID int identity( ) constraint Employee_pk primary key FirstName varchar() LastName Varchar() Sex char() Salutation as case when Sex =M then Mr when Sex =F then Ms else end Salary Money Deductions as case When Salary < then * Salarywhen Salary between and then *Salary when Salary between and then *Salaryelse *Salary end DOJ datetime constraint DOJ_DEF default getdate())
很容易的一個表其中用到了case子句分別對Salutation deductionsdoj等進行了設置而我們可以再搞一個存儲過程如下
Create procedure employee_insert@Fname varchar()@Lname varchar()@sex char()@Salary Moneyasdeclare @empoutput table (EmpID int FirstName varchar() LastName Varchar()Sex char() Salutation char()Salary MoneyDeductions MoneyDOJ datetime )insert into Employee(FirstNameLastNameSalarysex)OUTPUT inserted* into @empoutputvalues(@Fname @Lname @Salary@sex )Select * from @empoutput
然後在調用該存儲過程時可以這樣來用USE [MyDatabase]
GOexec employee_insert MihoYoshikawaF
這樣將在執行的時候將往employee表裡插入數據並且將定義了一個臨時的變量empoutput注意哦這個可以以表的形式定義的這裡很容易看的出來並且將插入到employee表的數據同時輸出到這個empoutput變量中去我們執行這個存儲過程後會發現如下結果
EmpIDFirstNameLastNameSexSalutationSalaryDeductionsDOJ
MihoYoshikawaFMs ::
並且employee表中的確插入了記錄
調用帶有Output參數的存儲過程txt
CREATE PROCEDURE SP_RealTimeDisplay
(
@FromEmp nvarchar()
@FromDep nvarchar()
@i nvarchar() output
@i nvarchar() output
@i nvarchar() output
)
AS
set nocount on
公司批復
select @i=(Select count(FsignID) as Sum From T_MessageSignature Where FSignID=@FromEmp and FLastSignID= and FSignRemark is null)
會簽意見
select @i=(Select count(FsignID) as Sum From T_MessageSignature Where FSignID=@FromEmp and FLastSignID= and FSignRemark is null)
考勤審批
select @i=(Select count(FKaoQinID) as Sum From T_KaoQin Where FDepID Like @FromDep and FCheckerID=)
GO
調用先定義再輸出
DECLARE @a nvarchar()
DECLARE @b nvarchar()
DECLARE @c nvarchar()
Execute SP_RealTimeDisplay %@a output@b output@c output
select @a as aa @b as bb@c as cc
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22419.html