sql server实用操作小技巧

此文是Sql Server实用操作小技巧集合,包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等。

 
  (一)挂起操作

  在安装Sql或sp补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法:

  到HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager
  删除PendingFileRenameOperations




  (二)收缩数据库


  --重建索引
  DBCC REINDEX
  DBCC INDEXDEFRAG
  --收缩数据和日志
  DBCC SHRINKDB
  DBCC SHRINKFILE

 

  (三)压缩数据库


  dbcc shrinkdatabase(dbname)

 

  (四)转移数据库给新用户以已存在用户权限


  exec sp_change_users_login 'update_one','newname','oldname'
  go

  (五)检查备份集


  RESTORE VERIFYONLY from disk='E:/dvbbs.bak'

  (六)修复数据库


  ALTER DATABASE [dvbbs] SET SINGLE_USER
  GO
  DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
  GO
  ALTER DATABASE [dvbbs] SET MULTI_USER
  GO

  --CHECKDB 有3个参数:

  --REPAIR_ALLOW_DATA_LOSS

 

--  执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复男薷础P薷赐瓿珊螅阜菔菘狻?

  --REPAIR_FAST 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。

 

  --REPAIR_REBUILD 执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。


  --DBCC CHECKDB('dvbbs') with NO_INFOMSGS,PHYSICAL_ONLY

  SQL SERVER日志清除的两种方法
  在使用过程中大家经常碰到数据库日志非常大的情况,在这里介绍了两种处理方法……

  方法一

  一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大

  1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存。

  2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点确定。

  3、收缩数据库完成后,建议将您的数据库属性重新设置为标准模式,操作方法同第一点,因为日志在一些异常情况下往往是恢复数据库的重要依据

  方法二


  SET NOCOUNT ON
  DECLARE @LogicalFileName sysname,
  @MaxMinutes INT,
  @NewSize INT

  USE     tablename             -- 要操作的数据库名
  SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名
  @MaxMinutes = 10,               -- Limit on time allowed to wrap log.
  @NewSize = 1                  -- 你想设定的日志文件的大小(M)

 

-- Setup / initialize
  DECLARE @OriginalSize int
  SELECT @OriginalSize = size
  FROM sysfiles
  WHERE name = @LogicalFileName
  SELECT 'Original Size of ' + db_name() + ' LOG is ' +
  CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
  CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
  FROM sysfiles
  WHERE name = @LogicalFileName
  CREATE TABLE DummyTrans
  (DummyColumn char (8000) not null)


  DECLARE @Counter   INT,
  @StartTime DATETIME,
  @TruncLog  VARCHAR(255)
  SELECT  @StartTime = GETDATE(),
  @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

  DBCC SHRINKFILE (@LogicalFileName, @NewSize)
  EXEC (@TruncLog)
  -- Wrap the log if necessary.
  WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
  AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 
  AND (@OriginalSize * 8 /1024) > @NewSize 
  BEGIN -- Outer loop.
  SELECT @Counter = 0
  WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
  BEGIN -- update
  INSERT DummyTrans VALUES ('Fill Log') 
  DELETE DummyTrans
  SELECT @Counter = @Counter + 1
  END  
  EXEC (@TruncLog) 
  END  
  SELECT 'Final Size of ' + db_name() + ' LOG is ' +
  CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
  CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
  FROM sysfiles
  WHERE name = @LogicalFileName
  DROP TABLE DummyTrans
  SET NOCOUNT OFF

- 作者: 酒醒无梦 2005年05月29日, 星期日 23:20  回复(0) |  引用(0) 加入博采

SQL语句导入导出大全
 /******* 导出到excel
EXEC master..xp_cmdshell ''bcp SettleDB.dbo.shanghu out c:/temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""''

 


/*********** 导入Excel
SELECT *
FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
''Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0'')...xactions


/*动态文件名
declare @fn varchar(20),@s varchar(1000)
set @fn = ''c:/test.xls''
set @s =''''''Microsoft.Jet.OLEDB.4.0'''',
''''Data Source="''+@fn+''";User ID=Admin;Password=;Extended properties=Excel 5.0''''''
set @s = ''SELECT * FROM OpenDataSource (''+@s+'')...sheet1$''
exec(@s)
*/


SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+'' '' 转换后的别名
FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
''Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0'')...xactions


/********************** EXCEL导到远程SQL
insert OPENDATASOURCE(
''SQLOLEDB'',
''Data Source=远程ip;User ID=sa;Password=密码''
).库名.dbo.表名 (列名1,列名2)
SELECT 列名1,列名2
FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
''Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0'')...xactions



/** 导入文本文件
EXEC master..xp_cmdshell ''bcp dbname..tablename in c:/DT.txt -c -Sservername -Usa -Ppassword''


/** 导出文本文件
EXEC master..xp_cmdshell ''bcp dbname..tablename out c:/DT.txt -c -Sservername -Usa -Ppassword''

EXEC master..xp_cmdshell ''bcp "Select * from dbname..tablename" queryout c:/DT.txt -c -Sservername -Usa -Ppassword''


导出到TXT文本,用逗号分开
exec master..xp_cmdshell ''bcp "库名..表名" out "d:/tt.txt" -c -t ,-U sa -P password''



BULK INSERT 库名..表名
FROM ''c:/test.txt''
WITH (
FIELDTERMINATOR = '';'',
ROWTERMINATOR = ''/n''
)



--/* dBase IV文件
select * from
OPENROWSET(''MICROSOFT.JET.OLEDB.4.0''
,''dBase IV;HDR=NO;IMEX=2;DATABASE=C:/'',''select * from [客户资料4.dbf]'')
--*/


--/* dBase III文件
select * from
OPENROWSET(''MICROSOFT.JET.OLEDB.4.0''
,''dBase III;HDR=NO;IMEX=2;DATABASE=C:/'',''select * from [客户资料3.dbf]'')
--*/


--/* FoxPro 数据库
select * from openrowset(''MSDASQL'',
''Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:/'',
''select * from [aa.DBF]'')
--*/


/**************导入DBF文件****************/
select * from openrowset(''MSDASQL'',
''Driver=Microsoft Visual FoxPro Driver;
SourceDB=e:/VFP98/data;
SourceType=DBF'',
''select * from customer where country != "USA" order by country'')
go
/***************** 导出到DBF ***************/
如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句


insert into openrowset(''MSDASQL'',
''Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:/'',
''select * from [aa.DBF]'')
select * from 表


说明:
SourceDB=c:/ 指定foxpro表所在的文件夹
aa.DBF 指定foxpro表的文件名.




/*************导出到Access********************/
insert into openrowset(''Microsoft.Jet.OLEDB.4.0'',
''x:/A.mdb'';''admin'';'''',A表) select * from 数据库名..B表


/*************导入Access********************/
insert into B表 selet * from openrowset(''Microsoft.Jet.OLEDB.4.0'',
''x:/A.mdb'';''admin'';'''',A表)


文件名为参数
declare @fname varchar(20)
set @fname = ''d:/test.mdb''
exec(''SELECT a.* FROM opendatasource(''''Microsoft.Jet.OLEDB.4.0'''',
''''''+@fname+'''''';''''admin'''';'''''''', topics) as a '')


SELECT *
FROM OpenDataSource( ''Microsoft.Jet.OLEDB.4.0'',
''Data Source="f:/northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;'')...产品


********************* 导入 xml 文件


DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc =''



Customer was very satisfied




Important
Happy Customer.




''
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc


-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, ''/root/Customer/Order'', 1)
WITH (oid char(5),
amount float,
comment ntext ''text()'')
EXEC sp_xml_removedocument @idoc

/**********************Excel导到Txt****************************************/
想用
select * into opendatasource(...) from opendatasource(...)
实现将一个Excel文件内容导入到一个文本文件


假设Excel中有两列,第一列为姓名,第二列为很行帐号(16位)
且银行帐号导出到文本文件后分两部分,前8位和后8位分开。



邹健:
如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2
缓缶涂梢杂孟旅娴挠锞浣胁迦?br> 注意文件名和目录根据你的实际情况进行修改.


insert into
opendatasource(''MICROSOFT.JET.OLEDB.4.0''
,''Text;HDR=Yes;DATABASE=C:/''
)...[aa#txt]
--,aa#txt)
--*/
select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
from
opendatasource(''MICROSOFT.JET.OLEDB.4.0''
,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/a.xls''
--,Sheet1$)
)...[Sheet1$]



如果你想直接插入并生成文本文件,就要用bcp


declare @sql varchar(8000),@tbname varchar(50)


--首先将excel表内容导入到一个全局临时表
select @tbname=''[##temp''+cast(newid() as varchar(40))+'']''
,@sql=''select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8)
into ''+@tbname+'' from
opendatasource(''''MICROSOFT.JET.OLEDB.4.0''''
,''''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:/a.xls''''
)...[Sheet1$]''
exec(@sql)


--然后用bcp从全局临时表导出到文本文件
set @sql=''bcp "''+@tbname+''" out "c:/aa.txt" /S"(local)" /P"" /c''
exec master..xp_cmdshell @sql


--删除临时表
exec(''drop table ''+@tbname)



/********************导整个数据库*********************************************/


用bcp实现的存储过程



/*
实现数据导入/导出的存储过程
根据不同的参数,可以实现导入/导出整个数据库/单个表
调用示例:
--导出调用示例
----导出单个表
exec file2table ''zj'','''','''',''xzkh_sa..地区资料'',''c:/zj.txt'',1
----导出整个数据库
exec file2table ''zj'','''','''',''xzkh_sa'',''C:/docman'',1


--导入调用示例
----导入单个表
exec file2table ''zj'','''','''',''xzkh_sa..地区资料'',''c:/zj.txt'',0
----导入整个数据库
exec file2table ''zj'','''','''',''xzkh_sa'',''C:/docman'',0


*/
if exists(select 1 from sysobjects where name=''File2Table'' and objectproperty(id,''IsProcedure'')=1)
drop procedure File2Table
go
create procedure File2Table
@servername varchar(200) --服务器名
,@username varchar(200) --用户名,如果用NT验证方式,则为空''''
,@password varchar(200) --密码
,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表
,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt
,@isout bit --1为导出,0为导入
as
declare @sql varchar(8000)


if @tbname like ''%.%.%'' --如果指定了表名,则直接导出单个表
begin
set @sql=''bcp ''+@tbname
+case when @isout=1 then '' out '' else '' in '' end
+'' "''+@filename+''" /w''
+'' /S ''+@servername
+case when isnull(@username,'''')='''' then '''' else '' /U ''+@username end
+'' /P ''+isnull(@password,'''')
exec master..xp_cmdshell @sql
end
else
begin --导出整个数据库,定义游标,取出所有的用户表
declare @m_tbname varchar(250)
if right(@filename,1)<>''/'' set @filename=@filename+''/''


set @m_tbname=''declare #tb cursor for select name from ''+@tbname+''..sysobjects where xtype=''''U''''''
exec(@m_tbname)
open #tb
fetch next from #tb into @m_tbname
while @@fetch_status=0
begin
set @sql=''bcp ''+@tbname+''..''+@m_tbname
+case when @isout=1 then '' out '' else '' in '' end
+'' "''+@filename+@m_tbname+''.txt " /w''
+'' /S ''+@servername
+case when isnull(@username,'''')='''' then '''' else '' /U ''+@username end
+'' /P ''+isnull(@password,'''')
exec master..xp_cmdshell @sql
fetch next from #tb into @m_tbname
end
close #tb
deallocate #tb
end
go



/************* Oracle **************/
EXEC sp_addlinkedserver ''OracleSvr'',
''Oracle 7.3'',
''MSDAORA'',
''ORCLDB''
GO


delete from openquery(mailser,''select * from yulin'')


select * from openquery(mailser,''select * from yulin'')


update openquery(mailser,''select * from yulin where id=15'')set disorder=555,catago=888


insert into openquery(mailser,''select disorder,catago from yulin'')values(333,777)



补充:


对于用bcp导出,是没有字段名的.


用openrowset导出,需要事先建好表.


用openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值