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内