zoukankan      html  css  js  c++  java
  • SqlServer日常积累(一)

    1. 将一个表的数据插入另一个表

    情况一:目标表已存在

    (1)如果2张表的字段一致,并且希望插入全部数据,可以用这种方法:

    Insert Into 目标表 Select * From 来源表;    
    --例如
    Insert Into newArticles Select * From articles;

    (2)如果只希望导入指定字段,可以用这种方法:

    Insert Into 目标表 (字段1, 字段2, ...) Select 字段1, 字段2, ... From 来源表;

    情况二:目标表不存在

    (1)如果将一个表的数据放在另外一个不存在的表:

    Select * Into 目标不存在的表 From 来源表

    (2)如果只希望导入指定字段,可以用这种方法:

    Select 字段1,字段2,... Into 目标不存在的表 From 来源表

    2. sql修改表的字段类型

    alter table 表名 alter column 字段名 新的字段类型    
    --例如
    alter table mytable alter column mycol1 int default 0

    3. 远程导入表数据(不同服务器数据库之间的数据操作)

    方法一:

    --创建链接服务器
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
    exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 '
    --查询:  select * from ITSV.数据库名.dbo.表名
    --导入: select * into 表 from ITSV.数据库名.dbo.表名
    --不再使用时删除链接服务器
    exec sp_dropserver  'ITSV ', 'droplogins '
     
    方法二:
    --连接远程/局域网数据(openrowset/openquery/opendatasource)
    (1)openrowset
    --查询:  select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    --生成本地表:  select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
    --把本地表导入远程表:  insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)  select * from 本地表
    eg.
    insert openrowset('SQLOLEDB', '10.1.23.141DB2000'; 'sa'; '!QAZ2wsx',SafefoodPt.dbo.Article)
    (title,author,riqi,content,ispic,istop,pic,zhaiyao)
    select Title,Author,UpdateTime,Content,IncludePic,OnTop,DefaultPicUrl,cast(lmd as varchar(20)) from Article
    --更新本地表: 
    update b  set b.列A=a.列A 
    from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b
    on a.column1=b.column1
    (2)openquery用法需要创建一个连接
     --首先创建一个连接创建链接服务器
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '
    --查询:   select * From openquery(ITSV,  'Select *  From 数据库.dbo.表名 ')
    --把本地表导入远程表:  insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')  select * from 本地表
    --更新本地表:  update b  set b.列B=a.列B  FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a  inner join 本地表 b on a.列A=b.列A
     
    (3)opendatasource/openrowset
    Select *  From opendatasource( 'SQLOLEDB ',  'Data Source=服务器名;User ID=登陆名;Password=密码 ' ).数据库名.dbo.表名
    --把本地表导入远程表
    4.Ad Hoc Distributed Queries的启用与关闭 

    启用Ad Hoc Distributed Queries:

    exec sp_configure 'show advanced options',1   

    reconfigure   

    exec sp_configure 'Ad Hoc Distributed Queries',1   

    reconfigure       

    关闭Ad Hoc Distributed Queries:

    exec sp_configure 'Ad Hoc Distributed Queries',0   

    reconfigure   

    exec sp_configure 'show advanced options',0   

    reconfigure

    5. 用第二个表数据更新主表字段

    方式一(适用于多字段):

    UPDATE tableA
    SET name = B.name, age = B.age
    FROM tableA A,tableB B WHERE A.Id = B.Id

    方式二(适用于单字段):

    UPDATE tableA 
    SET name = (SELECT B.name FROM tableB B
                WHERE B.Id = Id)

    6. 添加行号列(row_number()此函数2005后数据库可用)

    select row_number()over(order by userid )as RowNum,  *  from  tableName
    

    7.动态语句中添加变量

    (1)非字符串类型变量

    declare 
        @Number int,@sql nvarchar(1000)
    set @Number = 19;
    set @sql = 'select Time, Humidity, EquipmentNum
    from DataMonitoring 
    where Id = '+convert(nvarchar(10),@Number);
    exec(@sql);

    (2)字符串类型变量

    declare 
        @Char nvarchar(20),@sql nvarchar(1000)
    set @Char = '00:00';
    set @sql = 'select Time, Humidity, EquipmentNum
    from DataMonitoring 
    where Time = '''+@Char+'''';
    exec(@sql);

    8.选取数据插入临时表并添加自增行号

    declare 
        @maxRowNum int, @sql nvarchar(1000)
    select Time, Humidity, EquipmentNum, RowNum = identity(int,1,1)
    into  #temp0 from DataMonitoring  where Time = '00:00'
    
    select @maxRowNum = max(RowNum) from #temp0;
    
    set @sql = 'select Time, Humidity, EquipmentNum, RowNum = identity(int,'+convert(nvarchar(10),@maxRowNum+1)+',1)
    into ##temp0 from DataMonitoring where Time = ''01:00''';
    exec(@sql);
    select * from ##temp0 union select * from #temp0 order by RowNum;
    drop table #temp0; drop table ##temp0;

     9. @Result = @@ROWCOUNT

    返回受上一语句影响的行数。 如果行数大于 20 亿,请使用 @@ROWCOUNT_BIG。

    10. 在sql存储过程中,不能使用表明变量(如:@tableName),若想使用表明变量只可使用动态Sql语句。

    Create Procedure  GetList
    @tablename  varchar(20)
    AS
    BEGIN
    declare @sqlcommand varchar(max)     --sql名称串变量
            set @sqlcommand ='select * from '+@tablename  --构造这个字符串     
            exec(@sqlcommand )    --执行sql命令
    END
    GO
    

      

  • 相关阅读:
    laravel扩展xls处理maatwebsite/excel
    php连接ftp
    sublime
    非对称加密
    cron以及在laravel中使用cron
    多任务-python实现-生成器相关(2.1.13)
    多任务-python实现-迭代器相关(2.1.12)
    多任务-python实现-协程(2.1.11)
    多任务-python实现-多进程文件拷贝器(2.1.10)
    多任务-python实现-进程pool(2.1.9)
  • 原文地址:https://www.cnblogs.com/xinaixia/p/3968106.html
Copyright © 2011-2022 走看看