目录
1.向表中插入一行
2.使用默认值插入行
4.在表中插入拥有uniqueidentifier列的行
5.使用INSERT。。。SELECT语句插入行
6.调用存储过程插入数据
7.通过VALUES插入多个行
8.将VALUES作为表源来使用
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当你必须在几个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'使用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使用一个示例测试存储过程,提前检查哪些行会被插入:
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'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())