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
    

      

  • 相关阅读:
    POJ 2723 Get Luffy Out(2-SAT)
    ZOJ 3613 Wormhole Transport
    HDU 4085 Peach Blossom Spring
    NBUT 1221 Intermediary
    NBUT 1223 Friends number
    NBUT 1220 SPY
    NBUT 1218 You are my brother
    PAT 1131. Subway Map (30)
    ZSTU OJ 4273 玩具
    ZSTU OJ 4272 最佳淘汰算法
  • 原文地址:https://www.cnblogs.com/xinaixia/p/3968106.html
Copyright © 2011-2022 走看看