• 【SQL Server学习笔记】INSERT、UPDATE 语句


    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内
  • 相关阅读:
    SpirngBoot整合Mybatis Plus多数据源
    SpringBoot整合EasyPoi 封装Excel导出通用工具类,行高自适应,导出图片
    阿里云服务器安装Docker Compose
    设置Docker容器里的时间
    坏代码导致的性能问题大赏:CPU占用飙到了900%!
    Java程序员涨薪必备的性能调优知识点,收好了!
    SprinMvc快速入门
    python中文乱码问题
    python中自定义函数类的引用(最全)
    datax
  • 原文地址:https://www.cnblogs.com/momogua/p/8304634.html
Copyright © 2020-2023  润新知