分类: sql2012-02-16 18:17 409人阅读 评论(0) 收藏 举报
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   

SP:
ALTER           procedure [dbo].[sp_I_InterfaceJobEvent]
@JobServer varchar(30) =NULL,
@JobType varchar(30)= NULL,
@JobStartTime datetime= NULL,
@JobEndTime datetime= NULL,
@SW1_FileType varchar(10)= NULL,
@SW2_SystemDate varchar(10)= NULL,
@SW3_GenDate varchar(10)= NULL,
@SW4_Email varchar(2)= NULL,
@JobStatus varchar(20) =NULL,
@JobMessage varchar(1000)= NULL,
@JobReturnCode char(2)= NULL,
@FileSearchPattern varchar(50)= NULL,
@FileListMatched varchar(5000)= NULL,
@SourceApplication varchar(3)= NULL,
@OptionalQualifier varchar(30)= NULL,
@SystemDate varchar(10)= NULL,
@LockBy varchar(30)= NULL,
@LockDate datetime= NULL,
@LockWorkstation varchar(30)=null
as
begin Insert into InterfaceJobEvent
(
[JobServer],
[JobType],
[JobStartTime],
[JobEndTime],
[SW1_FileType],
[SW2_SystemDate],
[SW3_GenDate],
[SW4_Email],
[JobStatus],
[JobMessage],
[JobReturnCode],
[FileSearchPattern],
[FileListMatched],
[SourceApplication],
[OptionalQualifier],
[SystemDate],
[LockBy],
[LockDate],
[LockWorkstation]
)
output inserted.JobID
values (
isnull(@JobServer,''),
isnull(@JobType,''),
isnull(@JobStartTime,GETDATE()),
@JobEndTime,
isnull(@SW1_FileType,''),
@SW2_SystemDate,
@SW3_GenDate,
isnull(@SW4_Email,''),
isnull(@JobStatus,''),
isnull(@JobMessage,''),
isnull(@JobReturnCode,''),
isnull(@FileSearchPattern,''),
isnull(@FileListMatched,''),
isnull(@SourceApplication,''),
isnull(@OptionalQualifier,''),
isnull(@SystemDate,''),
isnull(@LockBy,''),
@LockDate,
isnull(@LockWorkstation,'')
) --if @@rowcount > 0
--begin
-- return @@rowcount
--end
--else
-- return 0
--end end
 Dim int_Jobid As Int64
Try
With adtInterfaceJobEvent.InsertCommand .Parameters("@SW1_FileType").Value = SW1_FileType
.Parameters("@SW2_SystemDate").Value = SW2_SystemDate
.Parameters("@SW3_GenDate").Value = SW3_GenDate
.Parameters("@SW4_Email").Value = SW4_Email
.Parameters("@FileSearchPattern").Value = FileSearchPattern
.Parameters("@FileListMatched").Value = FileListMatched
.Parameters("@SourceApplication").Value = SourceApplication
.Parameters("@OptionalQualifier").Value = OptionalQualifier
.Parameters("@SystemDate").Value = SystemDate
.Parameters("@JobServer").Value = Environment.MachineName
.Parameters("@JobStartTime").Value = DateTime.Now
.Parameters("@JobType").Value = JobType
.Parameters("@JobStatus").Value = JobStatus End With If SqlConnection_DISDB.State = ConnectionState.Closed Then
SqlConnection_DISDB.Open()
End If int_Jobid = adtInterfaceJobEvent.InsertCommand.ExecuteScalar()

SQL Server output经典使用的更多相关文章

  1. SQL Server output子句用法 output inserted.id 获取刚插入数据的id

    --插入数据,并返回刚刚插入的数据id INSERT INTO [soloreztest] ([name]) output inserted.id VALUES ('solorez') --执行结果: ...

  2. sql server output用法说明

    带有output的insert语句. @@identity只能返回当前会话最后生产的标识列.  如果一次性插入多条语句的话. 需要返回这些自动生产的标识列. 那么outpu就派上用场了. declar ...

  3. SQL Server 2005 盛宴系列 经典教程

    SQL Server 2005 盛宴系列 经典教程  [复制链接]   发表于 2007-3-27 14:08 | 来自 51CTO网页 [只看他] 楼主     TECHNET  SQL serve ...

  4. Microsoft SQL Server Trace Flags

    Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...

  5. 回首经典的SQL Server 2005

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com SQL Server是我使用时间最长的数据库,算起来已经有10年了.上世纪90年代,微软在软件开发的所有领域高歌猛 ...

  6. SQL Server存储过程Return、output参数及使用技巧

    SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000 ...

  7. SQL Server 编程入门经典(3)之T-SQL基本语句

    本章内容简介: 如何从数据库检索数据(SELECT) 如何向表中插入数据(INSERT) 如何适当更新数据(UPDATE) 如何删除表中数据(DELETE) 3.1 基本SELECT语句  如果你在此 ...

  8. SQL server经典电子书、工具和视频教程汇总

    SQL server经典电子书.工具和视频教程汇总 SQL server经典电子书.工具和视频教程汇总 SQL Server是高校计算机专业的一门必修课程,同时众多企业采用SQL Server作为数据 ...

  9. qt调用sql server存储过程并获取output参数

    最近新做的一个项目需要使用qt5连接另一台机器上的sql server,虽然网上已有类似文章,但还是有些其中很少提及的问题,故在这里汇总下: qt连接sql server可以参考这篇文章: <Q ...

随机推荐

  1. PHP基础之 错误处理 及 异常处理

    错误处理: 1.使用die()方法,结束语句的执行,并输出错误消息 2.自定义错误和错误触发器 自定义错误处理函数(系统有默认的错误处理函数,自定义的错误处理会覆盖默认的处理函数) ========= ...

  2. pipe-filter 真难找啊

    http://blog.csdn.net/absurd/article/details/4307903

  3. HDOJ 4389 X mod f(x)

    数位DP........ X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  4. 将json返回的日期格式转换

    <script>         function ChangeDateFormat(cellval) {             var date = new Date(parseInt ...

  5. 【C语言入门教程】7.5 枚举

    在实际应用中,有的变量只有几种可能取值.如人的性别只有两种可能取值,星期只有七种可能取值.在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型.所谓枚举是指将变量的值一一列举出来,变量只限于列举出 ...

  6. Code First02---CodeFirst配置实体与数据库映射的两种方式

    Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API. 这两种方式分别是什么呢?下面进行一一解释: DataAnnotation ...

  7. BZOJ1012——[JSOI2008]最大数maxnumber

    1.题目大意:求末尾L个数的最大值,强制在线 2.分析:这个拿线段树可以直接水过,然后我写了一个 维护单调栈, 二分求最大值的短代码,手懒.... #include <cstdio> #i ...

  8. 常用的Git Tips

    导读 Git被越来越多的公司使用,因此我们需要了解Git使用过程中的一些技巧. 一.Configuration:配置 列举所有的别名与配置 git config --list Git 别名配置 git ...

  9. Git秘籍:在 Git 中进行版本回退

    导读 在这篇文章中,你将学到如何查看项目中的历史版本,如何进行版本回退,以及如何创建 Git 分支以便你可以大胆尝试而不会出现问题.快来试试吧. 在你的 Git 项目的历史中,你的位置就像是摇滚专辑中 ...

  10. UNTIY3D接入91SDK的办法

    原地址: http://bbs.18183.com/thread-111324-1-1.html UNITY3D接入Android-SDK 方法一:把UNITY3D游戏打成安卓项目文件,修改安卓项目文 ...