T-SQL笔记2:INSERT、UPDATE和DELETE
本章摘要
1:显示向一个IDENTITY列插入值
2:在表中插入拥有UNIQUEIDENTIFIER列的行
3:使用INSERT……SELECT语句插入多行
4:调用存储过程插入数据
5:根据FROM和WHERE字句更新行
6:更新大值数据类型的列
7:使用OPENROWSET和BULK插入或更新图片文件
8:DELETE
9:截断表
10:使用TOP分块修改数据
1:显示向一个IDENTITY列插入值
IDENTITY通常用作代理键(代理键是指由数据库生成的唯一的主键)。允许将显式值插入表的标识列中,必须使用SET IDENTITY_INSERT命令。
语法:SET IDENTITY_INSERT [ database_name . [ schema_name ] . ] table { ON | OFF }
database_name 定的表所在的数据库的名称。
schema_name 所属架构的名称。
table 包含标识列的表的名称。
任何时候,一个会话中只有一个表的 IDENTITY_INSERT 属性可以设置为 ON。如果某个表已将此属性设置为 ON,则对另一个表发出 SET IDENTITY_INSERT ON 语句时,SQL Server 将返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON,并报告已将其属性设置为 ON 的表。
如果插入值大于表的当前标识值,则 SQL Server 自动将新插入值作为当前标识值使用。
下面的语句假设ID为IDENTITY键,则会报错:
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel')
要使得语句顺利执行,必须:
SET IDENTITY_INSERT dbo.Tool ON
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel')
SET IDENTITY_INSERT dbo.Tool OFF
2:在表中插入拥有UNIQUEIDENTIFIER列的行
UNIQUEIDENTIFIER数据类型存储了一个16字节的GUID。在INSERT的VALUES字句中使用NEWID()函数,可以得到这个GUID。
3:使用INSERT……SELECT语句插入多行
使用INSERT...SELECT可以向表中插入多行。
语法:INSERT [INTO] table_or_view_name [ (column_list) ] SELECT column_list FROM data_source
如下列语句:
INSERT Shift_Archive (ShiftID, Name, StartTime, EndTime, ModifiedDate) SELECT ShiftID, Name, StartTime, EndTime, ModifiedDate FROM HumanResources.Shift ORDER BY ShiftID
4:调用存储过程插入数据
既然能使用INSERT...SELECT向表中插入多行,那么使用存储过程也一样可以达到如此效果。
语法:INSERT [INTO] table_or_view_name [ (column_list) ] EXEC stored_procedure_name [参数, …]
5:根据FROM和WHERE字句更新行
直接看示例:假设Production.Product表中有一个产品名臣“LMJ”,对于每一位顾客只允许购买两个。为了达到这个查询的目的,任何购物车中只要这个产品的数量超过两个,都要立刻调整为所要求的数量:
UPDATE Sales.ShoppingCartItem
SET Quantity=2, ModifiedDate=GETDATE()
FROM Sales.ShoppingCartItem c
INNER JOIN Production.Product p ON
c.ProductID = p.ProductID
WHERE p.Name='LMJ' AND c.Quantity > 2
6:更新大值数据类型的列
SQLSERVER中带(MAX)的字段,均为大值数据类型。
来看示例:
CREATE TABLE RecipeChapter
(ChapterID int NOT NULL, Chapter varchar(max) NOT NULL)
INSERT RecipeChapter values( 1, '1234567890')
UPDATE RecipeChapter SET Chapter.WRITE('666',6, 3) WHERE ChapterID=1
根据示例,我们知道,插入大值数据,跟普通的插入语法没有区别。不过,在更新大值数据的时候,SQLSERVER2005提供新的语法.WRITE来提高效率。
7:使用OPENROWSET和BULK插入或更新图片文件
看示例,我们将系统中的图片文件插入或更新到表中:
CREATE TABLE StockGifs
(StockGifID int NOT NULL,
Gif varbinary(max) NOT NULL)
INSERT StockGifs (StockGifID, Gif)
SELECT 1, BulkColumn FROM OPENROWSET(BULK'C:\XXX.gif', SINGLE_BLOB) AS x
SELECT * FROM StockGifs WHERE StockGifID=1
8:DELETE
示例:
DELETE Production.Example_ProductProductPhoto WHERE ProductID NOT IN (SELECT ProductID FROM Production.Product)
9:截断表
使用TRUNCATE可以截断表。由于它总是从表中删除所有的行,所以没有FROM和WHERE字句。示例:
--首先放入测试数据
SELECT * INTO Sales.Example_StoreContact FROM Sale.StoreContact
--然后截断
TRUNCATE TABLE Sales.Example_StoreContact
注意:如果表有外键约束,则无法这样使用。
10:使用TOP分块修改数据
使用TOP修改数据,能大幅提高性能并减少日志产出。示例:
WHILE( SELECT COUNT(*) FROM Production.Example_BillOfMaterials) > 0
BEGIN
DELETE TOP(500) FROM Production.Example_BillOfMaterials
END
NET C# 入门级 | .NET C# 专业级 | .NET 架构级 | BS系统专业级 | BS系统安全 |
1.开篇及C#程序、解决方案的结构 2.源码管理之TFS入门 3.打老鼠初级 …… 21.CMS之主要功能实现 22.进程和线程基础 23.类型转换 24.算法基础 25.初级课程之剩余知识点 |
1.消灭打老鼠游戏中的自定义委托 2.垃圾回收 3.Dispose模式 …… 16.异常使用指导 17.最常用的重构指导 18.Debug和IDE的进阶 19.Resharper的使用 20.ILSPY的使用 |
1.Socket入门 2.打造打老鼠游戏网络版 3.WCF入门 …… 10.依赖注入 11.万物兼可测试 12.软件指标之覆盖率计算 13.软件指标之代码行 14.软件指标之圈复杂度、嵌套深度 |
1.HTML 2.WebForm原理 3.CSS必知必会 …… 19.让浏览器缓存Shop 20.Asp.net的生命周期 21.Asp.net网站的发布以及调试晋级 22.BS程序的本质 23.压力测试我们的Shop |
1.Fiddler必知必会 2.IE开发者工具必知必会 3.跨站脚本防范 4.权限欺骗防范 5.参数越界防范 6.会话劫持防范 7.CSRF防范 8.盗链防范 9.静态文件的保护 |