1、INSERT语句
--通过default关键字显式插入默认值 insert into Production.Location (Name,CostRate,Availability,ModifiedDate) values('Wheel Storage',11.25,80.00, DEFAULT) --如整个表所有列都定义了默认值,通过default values显式插入一行默认值 insert into dbo.WC defualt values /*================================================================== 向表中的IDENTITY列显式插入一个值, 通过set identity_insert设置在当前会话中的某个表,可以显式插入值. 如果插入值大于当前的标识值,表的新插入会自动使用新值作为标识的种子 1.任何会话、任何作用域、指定表最后生成的标识值 ident_current('dbo.t') 当前标识值 ident_seed('dbo.t') 当前种子 IDENT_INCR('dbo.t') 当前增量 2.当前会话、任何作用域(跨作用域,可能会受到触发器的影响, 看到触发器作用域中另外一个表的最后标识值)、任何表最后生成的标识值 @@identity 3.当前会话、当前作用域(不是作用域之外的触发器作用域)、任何表最后生成的标识值 scope_identity() 4.如果表中有identity属性列,可通过关键字identitycol或者$IDENTITY表示列 select IDENTITYCOL from t SELECT $IDENTITY FROM T 5.identity函数:只用于在带有INTO table子句的SELECT语句中将标识列插入到新表中。 尽管类似,但是IDENTITY函数与CREATE TABLE和ALTER TABLE一起使用的IDENTITY属性是不同的。 IDENTITY (data_type [ , seed , increment ] ) AS column_name ====================================================================*/ create table t(idd int not null identity(1,1)) go insert into t default values go 6 --批处理执行6次,添加6条记录 --潜在的问题:可以插入重复值------- set identity_insert dbo.t on insert into t(idd) values(6) set identity_insert dbo.t off --------------------------------- --当前标识值 select IDENT_CURRENT('dbo.t') --6 --仅当使用了列列表且identity_insert置为ON时可用 set identity_insert dbo.t on insert into t(idd) --插入一个大于当前标识值的数 values(10) set identity_insert dbo.t off --查看当前标识值已变为10 select IDENT_CURRENT('dbo.t') --显示当前最大的标识值 dbcc checkident('dbo.t',noreseed) --重新设置新的当前的identity值 dbcc checkident('dbo.t',reseed,1) with no_infomsgs --identity函数 select *, IDENTITY(int,1,1) as wcVID into wcTTT from dbo.t /*===================================================================== 在确保跨库、跨表的唯一性时,使用identity值可能会有主键冲突, 在表中定义uniqueidentifier数据类型的列,可以避免冲突。 1.此列存储一个16字节的全球唯一标识符GUID,能确保同一数据库、不同库跨表的唯一性, 此值借助网卡GUID来生成,如没有网卡,SQL Server会产生一个唯一的并且固定的值, 这个可能和其他服务器产生的值重复。 此值通常作为整数值键的补充,但是对大表,有时会导致查询性能较低 2.如果表中有uniqueidentifier类型列(一个表中可以指定多个此类型的列),同时列定义中有关键字ROWGUIDCOL, 那么可以用ROWGUIDCOL表示列(一个表只能有一个rowguidcol属性的列) select ROWGUIDCOL from tt 3.插入这个列值可用NEWID()系统函数,此函数生成一个唯一uniqueidentifier类型的值 4.如需要每个新生成的值都大于之前生成的任何值, 只能在create table或alter table语句中uniqueidentifier类型的列的, default表达式中指定NEWSEQUENTIALID()函数 ======================================================================*/ create table tt(WC_ID uniqueidentifier DEFAULT (NEWID()) ) insert into tt values(NEWSEQUENTIALID()) --newsequentialid()函数 create table tt_t(WC_ID uniqueidentifier rowguidcol DEFAULT (newsequentialid())) insert into tt_t values(default) go 6 select rowguidcol from tt_t--调用存储过程插入数据 CREATE TABLE logs(database_name NVARCHAR(128), log_size REAL, log_space_used REAL, status INT) --只要列顺序保持一致,列名可以不写,注意数据类型必须一致 INSERT INTO logs (database_name,log_size,log_space_used,status) EXEC('DBCC SQLPERF(LOGSPACE)') --使用insert...select语句添加行,用了上面建立的logs表 INSERT INTO logs (database_name,log_size,log_space_used,status) SELECT database_name,log_size,log_space_used,status FROM logs --values关键字一次添加多条记录 INSERT INTO logs (database_name,log_size,log_space_used,status) VALUES ('pg',1.12,0.16,0), ('wc',3.18,8.18,0), ('abc',6.19,0.78,0), ('win',8.12,0.99,0) --把values作为表的数据源使用 SELECT * FROM ( VALUES ('pg',1.12,0.16,0), ('wc',3.18,8.18,0), ('abc',6.19,0.78,0), ('win',8.12,0.99,0) )x(a,b,c,d) --必须有别名和列名,否则报错
2、UPDATE语句
/*================================================== 如果在update中要与其他表进行关联, 那么应该在from子句中再次指定要更新的表,同时指定别名, 这个from中表只是其他关联其他表的作用 update 更新的表 set 列名 = 值 from 更新的表 as 别名1 inner join 其他表 as 别名2 on 关联条件 where 过滤条件 注意:其他表也可以是CTE表达式,可以写比较复杂的语句 ====================================================*/ --新增一列 alter table sales.ShoppingCartItem add wc varchar(10) default 'wc' UPDATE sales.ShoppingCartItem set Quantity = 2, ModifiedDate = GETDATE(), wc = DEFAULT --增加一列默认值 from sales.ShoppingCartItem c inner join Production.Product p on c.ProductID = p.ProductID where p.Name = 'Full-Finger Gloves,M' and c.Quantity > 2 /*================================================== 对大值数据类型进行插入、更新、删除,与普通列完全一样. update命令的.wirte方法能灵活更新大值: set 列名 .write(expression,@offset,@Length) expression:要放入列的文本 @Offset:指定了新文本在现有数据中存放的起始位置, 从0开始计算,但不能大于要在写操作中更新的列长度 如果是NULL,表示会添加到列的末尾 @Length:指定了需要覆盖部分的长度 ====================================================*/ CREATE TABLE t(v VARCHAR(max)) INSERT INTO T VALUES('abc') UPDATE t SET v .WRITE('ABC',NULL,NULL) --追加:'abcABC' UPDATE T SET v .write('123',0,1) --替换了1个字符: '123bcABC' UPDATE T SET v .write('xyz',9,1) --报错,因为第二个参数偏移量大于要更新的v列长度--通过openrowset、bulk插入更新图片 create table t(vid int not null, pic varbinary(max) not null) insert into t (vid,pic) select 1, BulkColumn --这个是从数据源获取的,要插入的列,默认的列名 from openrowset( BULK 'c:\DWHJ.jpg',--指定文件路劲,这里是本地路径 SINGLE_BLOB --指定二进制数据是SINGLE_BLOB --指定文本是SINGLE_CLOB、SINGLE_NCLOB )X --必须要别名 --引用定义的列别名 insert into t (vid,pic) select 1, binColumn --引用后面定义的列别名 from openrowset( BULK 'c:\DWHJ.jpg',--指定文件路劲,这里是本地路径 SINGLE_BLOB --指定二进制数据是SINGLE_BLOB --指定文本是SINGLE_CLOB、SINGLE_NCLOB )X(binColumn) --这里还定义了列的别名 update t set pic = ( select BulkColumn from openrowset(bulk 'c:\dwhj.bmp', SINGLE_BLOB) AS X --一定不要忘了定义别名 )--将非结构化数据存储在文件系统中,可以超过2GB的限制 --在SQL Server内可以控制事务和可恢复性 --1.在SQL Server配置管理器中的服务中选SQL Server服务, --右键属性,再选择FILESTREAMx选项卡,设置启动即可 --2.配置访问级别,查看服务器的文件流属性 sp_configure 'filestream access level',2 go reconfigure with override go select SERVERPROPERTY('FilestreamShareName'), SERVERPROPERTY('FilestreamEffectiveLevel'), SERVERPROPERTY('FilestreamConfiguredLevel') --3.创建数据库,必须有一个独立的文件组,只是存放文件流数据 create database wc on primary (name = 'wc_data', filename = 'c:\wc_data.mdf'), filegroup wc_filestream CONTAINS FILESTREAM --设置这个文件组包含文件流 (name = 'wc_fs_data', filename = 'c:\wc\FILESTREAM' --指定的目录是wc, --后面FILESTREAM必须写,但不能在wc文件夹内 --不是文件 ) log on (name = 'wc_log', filename = 'c:\wc_log.ldf') go /*================================================ 4.建立一个表,在具有filestream属性的列的表中, 列的定义必须满足条件: A.必须具有一个NOT NULL的、 B.唯一的(primary key或unique)、 C.rowguid(uniqueidentifier类型且rowguidcol属性) ==================================================*/ create table t(vid uniqueidentifier ROWGUIDCOL not null PRIMARY KEY, name varchar(50) not null, pic varbinary(max) FILESTREAM) --5.通过openrowset、bulk添加数据 insert into t (vid,name,pic) select NEWID(), 'c:\DWHJ.jpg', BulkColumn from openrowset(bulk 'c:\DWHJ.jpg', SINGLE_BLOB) AS X --6.oledb程序实现文件流 --需要用OpenSQLFileStream API、文件路径、事务标记来取得文件句柄, --然后通过ReadFile、WriteFile API函数读取、写入文件,然后关闭文件句柄 begin tran select pic.PathName() --取得文件路径名 from t --取得事物的标记 select GET_FILESTREAM_TRANSACTION_CONTEXT() commit tran --7.删除文件,可能不会马上看到文件系统下的底层文件被删除,最后会被垃圾收集进程删除 update t set pic = NULL --8、如果关闭FILESTREAM属性,那么所有数据都会存储在数据库数据文件中, --而不会存储在文件系统,列最大尺寸限制在2GB内