天天看点

SqlServer2008实例12 INSERT1.向表中插入一行2.使用默认值插入行4.在表中插入拥有uniqueidentifier列的行5.使用INSERT。。。SELECT语句插入行6.调用存储过程插入数据7.通过VALUES插入多个行8.将VALUES作为表源来使用

目录

1.向表中插入一行

2.使用默认值插入行

4.在表中插入拥有uniqueidentifier列的行

5.使用INSERT。。。SELECT语句插入行

6.调用存储过程插入数据

7.通过VALUES插入多个行

8.将VALUES作为表源来使用

1.向表中插入一行

use AdventureWorks
go

INSERT Production.Location
(Name,CostRate,Availability)
VALUES ('Wheel Storage',11.25,80.00)

SELECT Name,CostRate,Availability
FROM Production.Location
WHERE Name='Wheel Storage'
           
SqlServer2008实例12 INSERT1.向表中插入一行2.使用默认值插入行4.在表中插入拥有uniqueidentifier列的行5.使用INSERT。。。SELECT语句插入行6.调用存储过程插入数据7.通过VALUES插入多个行8.将VALUES作为表源来使用

2.使用默认值插入行

use AdventureWorks
go

INSERT Production.Location
(Name,CostRate,Availability,ModifiedDate)
VALUES ('Wheel Storage2',11.25,80.00,DEFAULT)

SELECT Name,CostRate,Availability,ModifiedDate
FROM Production.Location
WHERE Name='Wheel Storage2
           

3.显式向一个IDENTITY列插入值

     一个拥有IDENTITY属性的列会根据一个数字种子值和增量值自动增加.IDENTITY列通常用作代理键(代理键是一个由数据库生成的唯一的主键,通常不包含任何业务意义,仅用于在表中确保唯一性)。

    对于数据加载或者恢复的应用,可能需要为IDENTITY列手动插入显式值。

SET IDENTITY_INSERT HumanResources.department ON
INSERT HumanResources.Department
	(DepartmentID,Name,GroupName)
VALUES
	(17,'Database','Information Technology')
SET IDENTITY_INSERT HumanResources.department OFF
           

4.在表中插入拥有uniqueidentifier列的行

    当你必须在几个SQL Server实例中保证标识符唯一时,这个数据类型是有用的。例如,如果你将10个远程SQL Scrver实例生成的记录合并到一个soL Server实例中,使用IDENTITY值会有主键冲突的风险。而使用unjqueidentifier可以避免这个风险。

    uniqueidentifier数据类型存储了一个16字节的全球唯一标识符(GUID),它经常用来确保同一数据库甚至不同数据库跨表的唯一性。GUID通常可以作为整数值键的替补,但是对于大的表,相对于整数值来说,它们的宽度有时候会导致较低的查询性能。

    要为新的插入生成这个值可以使用NEWID系统函数。NEWID生成了一个唯一的uniqueidentifier数据类型的值:

use adventureworks
go

INSERT Purchasing.shipMethod
	(Name,ShipBase,ShipRate,rowguid)
VALUES
	('MIDDLETON CARGO TS1',8.99,1.22,NEWID())
	
SELECT rowguid,name
FROM Purchasing.ShipMethod
WHERE Name='MIDDLETON CARGO TS1'
           
SqlServer2008实例12 INSERT1.向表中插入一行2.使用默认值插入行4.在表中插入拥有uniqueidentifier列的行5.使用INSERT。。。SELECT语句插入行6.调用存储过程插入数据7.通过VALUES插入多个行8.将VALUES作为表源来使用

5.使用INSERT。。。SELECT语句插入行

    使用INSERT. .SELECT的语法基本和插入单行的语法基本一样,只是没有VALUES子句,而是指定一个SELECT查询把它返回的列和行填充到表或者可更新的视图中。SELECT查询能基于一个或多个数据源,只要列表的数据类型和目标表的数据类型一致就可以了。

把HumanResources .Shift表中的值填充到新的dbo.Shift_Archive表中:

use adventureworks
go

CREATE TABLE dbo.Shift_ARCHIVE
	(
		ShiftID			tinyint		NOT NULL,
		Name			dbo.Name	NOT NULL,
		StarTime		datetime	not null,
		EndTime			datetime	not null,
		ModifiedDate	datetime	not null DEFAULT (getdate())
		CONSTRAINT PK_Shift_ShiftID Primary KEY Clustered
		(ShiftID ASC)
	)
GO

INSERT Shift_ARCHIVE
	(ShiftID,Name,StarTime,EndTime,ModifiedDate)
SELECT ShiftID,Name,StartTime,EndTime,ModifiedDate
FROM HumanResources.Shift
ORDER BY ShiftID		
           
SqlServer2008实例12 INSERT1.向表中插入一行2.使用默认值插入行4.在表中插入拥有uniqueidentifier列的行5.使用INSERT。。。SELECT语句插入行6.调用存储过程插入数据7.通过VALUES插入多个行8.将VALUES作为表源来使用

6.调用存储过程插入数据

CREATE Procedure dbo.usp_SEL_Production_TransactionHistory
	@ModifiedStartDT	datetime,
	@ModifiedEndDT		datetime
AS	
SELECT TransactionID,ProductID,ReferenceOrderID,ReferenceOrderLineID,
       Transactiondate,TransactionType,Quantity,ActualCost,ModifiedDate
FROM Production.TransactionHistory
WHERE ModifiedDate BETWEEN @ModifiedStartDT AND @ModifiedEndDT
	  AND TransactionID NOT IN(SELECT TransactionID
	         FROM Production.TransactionHistoryArchive) 
           

使用一个示例测试存储过程,提前检查哪些行会被插入:

EXEC usp_SEL_Production_TransactionHistory '6/2/2004','6/3/2004'   
           

据传入存储过程的日期范围,这个查询返回568行。下面的示例,存储过程用来把568行插入到表Production.TransactionHistoryArchive中.

use adventureworks
go

INSERT Production.TransactionHistoryArchive
	(TransactionID,ProductID,ReferenceOrderID,ReferenceOrderLineID,
	 TransactionDate,TransactionType,Quantity,ActualCost,ModifiedDate)
Exec dbo.usp_SEL_Production_TransactionHistory '6/2/2004','6/3/2004'
           

7.通过VALUES插入多个行

    SQL Server 2008引入了一个新功能:可以使用单个INSERT命令插入多行,而不用使用子查询或调用存储过程。这可以为应用程序减少必需的代码量,也可以减少执行命令的数量。基本方法是使用VALUES来分组,然后指定一个或更多行及相应的列值:

use adventureworks
go

--创建一个查找表
CREATE TABLE HumanResources.Degree
	(
		DegreeID		int			not null Identity(1,1) primary Key,
		DegreeNM		varchar(30)	not null,
		DegreeCD		varchar(5)	not null,
		ModifiedDate	datetime	not null
	)
go

INSERT HumanResources.Degree
	(DegreeNM,DegreeCD,ModifiedDate)
VALUES
	('Bachelor of Arts','B.A.',GETDATE()),
	('Bachelor of Science','B.S.',GETDATE()),
	('Master of Arts','M.A.',GETDATE()),
	('Master of Science','M.S.',GETDATE()),
	('Associate''s Degree','A.A.',GETDATE())
           
SqlServer2008实例12 INSERT1.向表中插入一行2.使用默认值插入行4.在表中插入拥有uniqueidentifier列的行5.使用INSERT。。。SELECT语句插入行6.调用存储过程插入数据7.通过VALUES插入多个行8.将VALUES作为表源来使用

8.将VALUES作为表源来使用

SELECT DegreeNM,DegreeCD,ModifiedDT
FROM
(VALUES
	('Bachelor of Arts','B.A.',GETDATE()),
	('Bachelor of Science','B.S.',GETDATE()),
	('Master of Arts','M.A.',GETDATE()),
	('Master of Science','M.S.',GETDATE()),
	('Associate''s Degree','A.A.',GETDATE())
)
Degree (degreeNM,DegreeCD,ModifiedDT)
           
SqlServer2008实例12 INSERT1.向表中插入一行2.使用默认值插入行4.在表中插入拥有uniqueidentifier列的行5.使用INSERT。。。SELECT语句插入行6.调用存储过程插入数据7.通过VALUES插入多个行8.将VALUES作为表源来使用