目录
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'
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'
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
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())
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)