SqlServer日常积累(一)

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

--第一种情况

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

Insert Into 目标表 Select * From 来源表;    eg.  Insert Into newArticles Select * From articles;

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

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

--第二种情况

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

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

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

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

2. sql修改表的字段类型

alter table 表名 alter column 字段名 新的字段类型    eg.  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.141\DB2000'; '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更新多个字段

update a 

set    a = b.a    ,b=b.b    ,c=b.c

from tableA a,tableB b where (a.条件1) and (b.条件2)

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

  

你可能感兴趣的:(sqlserver)