快捷搜索:
来自 网络数据库 2019-06-23 09:11 的文章
当前位置: 67677新澳门手机版 > 网络数据库 > 正文

2008之行值构造器,OUTPUT做数据操作记录

 

相信大家都知道怎样使用数据操作语言(DML)对SQL Server表的数据进行插入、删除和更新等处理。有时候,我们需要用INSERT语句进行插入的数据实在是多得让人头疼,有很多传统但繁琐的方法可以用 来插入大批量数据,不过SQL Server 2008提供了一种能够简化数据插入过程的新方法。本文将为大家简单介绍这些用来插入数据的方法之间的差异,其中包括SQL Server 2008提供的新方法——行值构造器(Row Value Constructor)。

OUTPUT 子句

我们向表插入数据的传统方法有三个,介绍如下:

可以在数据进行增删改的时候,可以返回受影响的行。先准备一张表

方法一

create table #t
(
    id int identity primary key 
    ,name varchar(100)
)
go

假设我们有一个名为MyTestDB的数据库,其中有一个名为MyTest1的表,数据库和表的创建过程如下:


USE [master] 
GO 
IF EXISTS (SELECT name FROM sys.databases 
WHERE name = N'MyTestDB') 
DROP DATABASE [MyTestDB] 
GO 
Create database MyTestDB 
Go 
Use [MyTestDB] 
Go 
IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N'[dbo].[MyTest1]') 
AND type in (N'U')) 
DROP TABLE [dbo].[MyTest1] 
GO 
USE [MyTestDB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[MyTest1]( 
[Id] [int] NULL, 
[Fname] [varchar](100) NULL, 
[Lname] [varchar](100) NULL, 
[salary] [money] NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 

 

现在我们用传统的ANSI插入语句向上表添加5行数据,这里需要用到带VALUE从句的INSERT SQL语句来插入数据,脚本如下:

1、insert ,影响行在inserted表里

insert into MyTest1 (id ,fname ,lname , salary) values (1 , 'John' , 'Smith' , 150000.00)

insert into #t(name)
output inserted.*
values('a')

insert into MyTest1 (id ,fname ,lname , salary) values (2 , 'Hillary' , 'Swank' , 250000.00)

返回结果:

insert into MyTest1 (id ,fname ,lname , salary) values (3 , 'Elisa' , 'Smith' , 120000.00)

id name


1 a

批量插入:

insert into #t
output inserted.*
select 'b'

insert into MyTest1 (id ,fname ,lname , salary) values (4 , 'Liz' , 'Carleno' , 151000.00)

id name


2 b

 


 

2、delete ,影响行在deleted表里

delete from #t
output deleted.id
where id = 1

返回结果:

insert into MyTest1 (id ,fname ,lname , salary) values (5 , 'Tony' , 'Mcnamara' , 150300.00)

id

1

 


 

3、update,会将新数据放在inserted表里,老数据放在deleted表里

update #t
set name='new value'
OUTPUT deleted.id,deleted.name,inserted.id,inserted.name  
where id=2

执行结果如下:

id name id name




2 d 2 new value

(1 row(s) affected)

 


 

4、OUTPUT INTO 支持将数据 插入到表里

DECLARE @outputTable TABLE(name1 varchar(100),name2 varchar(100))

update #t
set name='new value 3'
OUTPUT deleted.name,inserted.name into @outputTable
where id=2

SELECT * FROM @outputTable

(1 row(s) affected)

(1 row(s) affected)

name1 name2


new value new value 3

(1 row(s) affected)

 

 

)

 

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)

方法二

假设我们在上述的MyTestDB数据库中有表MyTest2,如下:

USE [MyTestDB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTest2]')AND type in (N'U')) 
DROP TABLE [dbo].[MyTest2] 
GO 
CREATE TABLE [dbo].[MyTest2]( 
[Id] [int] NULL, 
[Fname] [varchar](100) NULL, 
[Lname] [varchar](100) NULL, 
[salary] [money] NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 

下面我们再用另外一种传统的插入方法同样添加5行数据,也就是使用带SELECT从句的INSERT SQL语句,脚本如下:

insert into MyTest2 select 1 , 'John' , 'Smith' , 150000.00

insert into MyTest2 select 2 , 'Hillary' , 'Swank' , 250000.00

insert into MyTest2 select 3 , 'Elisa' , 'Smith' , 120000.00

insert into MyTest2 select 4 , 'Liz' , 'Carleno' , 151000.00

insert into MyTest2 select 5 , 'Tony' , 'Mcnamara' , 150300.00

执行结果如下:

(1 row(s) affected)

本文由67677新澳门手机版发布于网络数据库,转载请注明出处:2008之行值构造器,OUTPUT做数据操作记录

关键词: