SQL技巧

经典MSSQL语句大全和常用SQL语句命令的作用

 

SQL分类:

DDL类型包括数据库、表的创建,修改,删除,声明数据定义语言(CREATEALTERDROPDECLARE)

DML类型包括数据表中记录的查询,删除,修改,插入数据操纵语言(SELECTDELETEUPDATEINSERT)

DCL类型包括数据库用户赋权,废除用户访问权限, 提交当前事务,中止当前事务数据控制语言(GRANTREVOKECOMMITROLLBACK)

首先,简要介绍基础语句:

1、说明:创建数据库

CREATE DATABASE db1(db1代表数据库表,可自命名)

2、说明:删除数据库

drop database db1(db1代表数据库表,可自命名)

3、说明:备份sql server

--- 创建 备份数据的 device

USE master

EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

--- 开始 备份

BACKUP DATABASE pubs TO testBack

4、说明:创建新表

create table tb1(Id int not null primary key,name varchar,..)(tb1为数据表名,ID为字段,int为数据类型整型,not null为数据是否可为空,Primary Key为主键设置,其中not null,primary key为可选项,字段,数据类型自定义。)

根据已有的表创建新表:

Acreate table tab_new like tab_old (使用旧表创建新表)

Bcreate table tab_new as select col1,col2… from tab_old definition only

5、说明:

删除新表:drop table tb1

6、说明:

增加一个列:Alter table tabname add column col type

注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:

添加主键:Alter table tabname add primary key(ID)(设置某字段为主键,ID可自由设置,主键数据不可重复)

说明:

删除主键:Alter table tabname drop primary key(ID)(删除某字段主键)

8、说明:

创建索引:create [unique] index idxname on tabname(col….)

删除索引:drop index idxname

注:索引是不可更改的,想更改必须删除重新建。

9、说明:

创建视图:create view viewname as select statement

删除视图:drop view viewname

10、说明:几个简单的基本的sql语句

选择:select * from table1 where Id=1(Id=1为条件语句,根据自己情况自定义)

插入:insert into table1(field1,field2) values(value1,value2)

删除:delete from table1 where范围

更新:update table1 set field1=value1 where范围

查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!

排序:select * from table1 order by field1,field2 [desc]

总数:select count * as totalcount from table1

求和:select sum(field1) as sumvalue from table1

平均:select avg(field1) as avgvalue from table1

最大:select max(field1) as maxvalue from table1

最小:select min(field1) as minvalue from table1

11、说明:几个高级查询运算词

A UNION运算符

UNION运算符通过组合其他两个结果表(例如 TABLE1 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL UNION 一起使用时( UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1就是来自 TABLE2

B EXCEPT运算符

EXCEPT运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

C INTERSECT运算符

INTERSECT运算符通过只包括 TABLE1 TABLE2中都有的行并消除所有重复行而派生出一个结果表。当 ALL INTERSECT一起使用时 (INTERSECT ALL),不消除重复行。

注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接

Aleft outer join

左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

Bright outer join:

右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

Cfull outer join

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

其次,大家来看一些不错的sql语句

1、说明:复制表(只复制结构,源表名:a新表名:b) (Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a目标表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where条件

例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、说明:子查询(表名1a表名2b)

select a,b,c from a where a IN (select d from b )或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1a表名2b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1a )

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between数值1 and 数值2

9、说明:in的使用方法

select * from table1 where a [not] in (‘1’,’2’,’4’,’6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、说明:日程安排提前五分钟提醒

SQL: select * from日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql语句搞定数据库分页

select top 10 b.* from (select top 20主键字段,排序字段 from表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录

select top 10 * form table1 where范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA中但不在 TableBTableC 中的行并消除所有重复行而派生出一个结果表

(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

18、说明:随机选择记录

select newid()

19、说明:删除重复记录

Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、说明:列出数据库里所有的表名

select name from sysobjects where type='U'

21、说明:列出表里的所有的

select name from syscolumns where id=object_id('TableName')

22、说明:列示typevenderpcs字段,以type字段排列,case可以方便地实现多重选择,类似select中的case

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type

显示结果:

type vender pcs

电脑 A 1

电脑 A 1

光盘 B 2

光盘 A 2

手机 B 3

手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从1015的记录

select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)

对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数然后打印出来。实际上常见的解决方案是建立如下所示的循环:

Randomize

RNumber = Int(Rnd*499) +1

While Not objRec.EOF

If objRec("ID") = RNumber THEN

... 这里是执行脚本 ...

end if

objRec.MoveNext

Wend

这很容易理解。首先,你取出1500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID的值、检查其是否匹配RNumber。满足条件的话就执行由THEN关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?

采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:

Randomize

RNumber = Int(Rnd*499) + 1

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

set objRec = ObjConn.Execute(SQL)

Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")

不必写出RNumberID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作随机记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。

再谈随机数

现在你下定决心要榨干Random函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。

为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3

假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码)

SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

随机读取若干条记录,测试过

Access语法:SELECT top 10 * From表名 ORDER BY Rnd(id)

Sql server:select top n * from表名 order by newid()

mysql select * From表名 Order By rand() Limit n

Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有AccessSQL说明,只有自己测试,现在记下以备后查)

语法 select table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...

使用SQL语句 用...代替过长的字符串显示

语法:

SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename

Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

Conn.Execute说明

Execute方法

该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:

1.执行SQL查询语句时,将返回查询得到的记录集。用法为:

Set 对象变量名=连接对象.Execute("SQL查询语言")

Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:

连接对象.Execute "SQL操作性语句" [, RecordAffected][, Option]

·RecordAffected为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。

·Option可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

·BeginTransRollbackTransCommitTrans方法

这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。

事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。

BeginTransCommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信息。

SQL语句大全精要

DELETE语句

DELETE语句:用于创建一个删除查询,可从列在 FROM子句之中的一个或多个表中删除记录,且该子句满足 WHERE 子句中的条件,可以使用DELETE删除多个记录。

语法:DELETE [table.*] FROM table WHERE criteria

语法:DELETE * FROM table WHERE criteria='查询的字'

说明:table参数用于指定从其中删除记录的表的名称。

criteria参数为一个表达式,用于指定哪些记录应该被删除的表达式。

可以使用 Execute方法与一个 DROP 语句从数据库中放弃整个表。不过,若用这种方法删除表,将会失去表的结构。不同的是当使用 DELETE,只有数据会被删除;表的结构以及表的所有属性仍然保留,例如字段属性及索引。

UPDATE

有关UPDATE,急!!!!!!!!!!!

ORACLE数据库中

A ( ID ,FIRSTNAME,LASTNAME )

B( ID,LASTNAME)

A中原来ID,FIRSTNAME两个字段的数据是完整的

B中原来ID,LASTNAME两个字段的数据是完整的

现在要把表 B中的LASTNAME字段的相应的数据填入到A表中LASTNAME相应的位置。两个表中的ID字段是相互关联的。

update a set a.lastname=(select b.lastname from b where a.id=b.id)

常用sql语句命令的作用
1.
查看数据库的版本       

   select @@version

  2.
查看数据库所在机器操作系统参数
       

  exec master..xp_msver


  3.
查看数据库启动的参数
        

  sp_configure


  4.
查看数据库启动时间
        

  select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1

 
查看数据库服务器名和实例名


  print 'Server Name...............
' + convert(varchar(30),@@SERVERNAME)        

  print 'Instance..................
' + convert(varchar(30),@@SERVICENAME)  
       
  5.
查看所有数据库名称及大小
    

  sp_helpdb

 
重命名数据库用的
SQL

  sp_renamedb 'old_dbname', 'new_dbname'


  6.
查看所有数据库用户登录信息
    

  sp_helplogins

 
查看所有数据库用户所属的角色信息
       

  sp_helpsrvrolemember

 
修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程


 
更改某个数据对象的用户属主

 
  sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'

 
注意:更改对象名的任一部分都可能破坏脚本和存储过程。


 
把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本


 
查看某数据库下,对象级用户权限


  sp_helprotect


  7.
查看链接服务器
           
 
  sp_helplinkedsrvlogin

 
查看远端数据库用户登录信息

 
  sp_helpremotelogin


  8.
查看某数据库下某个数据对象的大小

  sp_spaceused @objname

 
还可以用sp_toptables过程看最大的N(默认为50)个表


 
查看某数据库下某个数据对象的索引信息


  sp_helpindex @objname

 
还可以用SP_NChelpindex过程查看更详细的索引情况


  SP_NChelpindex @objname

  clustered
索引是把记录按物理顺序排列的,索引占的空间比较少。
 

 
对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。


 
查看某数据库下某个数据对象的的约束信息


  sp_helpconstraint @objname

9.
查看数据库里所有的存储过程和函数



  use @database_name


  sp_stored_procedures


 
查看存储过程和函数的源代码



  sp_helptext '@procedure_name'


 
查看包含某个字符串@str的数据对象名称



  select distinct object_name(id) from syscomments where text like '%@str%'


 
创建加密的存储过程或函数在AS前面加WITH ENCRYPTION参数



 
解密加密过的存储过程和函数可以用sp_decrypt过程




  10.
查看数据库里用户和进程的信息


  sp_who

 
查看SQL Server数据库里的活动用户和进程的信息


  sp_who 'active'

 
查看SQL Server数据库里的锁的情况


  sp_lock

 
进程号1--50SQL Server系统内部用的,进程号大于50的才是用户的连接进程
.
 
  spid
是进程编号,dbid是数据库编号,objid是数据对象编号


 
查看进程正在执行的SQL语句


  dbcc inputbuffer ()

 
推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句


  sp_who3

 
检查死锁用sp_who_lock过程


  sp_who_lock
              
  11.
查看和收缩数据库日志文件的方法


 
查看所有数据库日志文件大小
          

  dbcc sqlperf(logspace)

 
如果某些日志文件较大,收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为
M

  backup log @database_name with no_log

  dbcc shrinkfile (@database_name_log, 5)


  12.
分析SQL Server SQL 语句的方法:


  set statistics time {on | off}

  set statistics io {on | off}

 
图形方式显示查询执行计划

 
在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L   或者点击工具栏里的图形


 
文本方式显示查询执行计划


  set showplan_all {on | off}

  set showplan_text { on | off }

  set statistics profile { on | off }


  13.
出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法

 
先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作


  alter database [@error_database_name] set single_user

 
修复出现不一致错误的表


  dbcc checktable('@error_table_name',repair_allow_data_loss)

 
或者可惜选择修复出现不一致错误的小型数据库名


  dbcc checkdb('@error_database_name',repair_allow_data_loss)

  alter database [@error_database_name] set multi_user

  CHECKDB
3个参数:


  repair_allow_data_loss
包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。

 
修复操作可以在用户事务下完成以允许用户回滚所做的更改。


 
如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。


 
如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。


 
修复完成后,请备份数据库。
 

  repai*_**st
进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。


 
这些修复可以很快完成,并且不会有丢失数据的危险。
 

  repair_rebuild
执行由 repai*_**st 完成的所有修复,包括需要较长时间的修复(如重建索引)。

三、技巧

11=11=2的使用,在SQL语句组合时用的较多

where 1=1” 是表示选择全部 “where 1=2”全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end

我们可以直接写成

错误!未找到目录项。
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1
安定 '+ @strWhere2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--
收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3、压缩数据库
dbcc shrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go

5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

7、日志清除
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

8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'

9、存储更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)

DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner
END

close curObject
deallocate curObject
GO


10SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
案例

有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

Namescore

Zhangshan80

Lishi 59

Wangwu 50

Songquan69

while((selectmin(score) from tb_table)<60)

begin

update tb_table set score=score*1.01

where score<60

if(selectmin(score) from tb_table)>60

break

else

continue

end

数据开发-经典


1.按姓氏笔画排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //
从少到多

2.数据库加密:
select encrypt('原始密码')
select pwdencrypt('
原始密码
')
select pwdcompare('
原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码
')
select pwdencrypt('
原始密码
')
select pwdcompare('
原始密码','加密后密码') = 1--相同;否则不相同

3.取回表中字段:
declare @list varchar(1000),
@sql nvarchar(1000)
select @list=@list+
','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='
A'
set @sql='select '+right(@list,len(@list)-1)+' from A'
exec (@sql)

4.查看硬盘分区:
EXEC master..xp_fixeddrives

5.比较A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
=
(select checksum_agg(binary_checksum(*)) from B)
print '
相等'
else
print '
不相等'

6.杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL
事件探查器')
EXEC sp_msforeach_worker '?
'

7.记录搜索:
开头到N条记录
Select Top N * From
-------------------------------
NM条记录(要有主索引ID)
Select Top M-N * FromWhere ID in (Select Top M ID From) Order by ID Desc
----------------------------------
N
到结尾记录
Select Top N * FromOrder by ID Desc
案例
例如1:一张表有一万多条记录,表的第一个字段 RecID是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。

select top 10 recid from A where recid notin(select top 30 recid from A)

分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

解决方案

1,用order byselect top 30 recid from A order by ricid如果该字段不是自增长,就会出现问题

2在那个子查询中也加条件:select top 30 recid from A where recid>-1

2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
set@s ='select top 1 * from Twhere pid not in (select top ' + str(@count-1) + ' pidfrom T)'

print@sexecsp_executesql@s

9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype='u' and status>=0

10:获取某一个表的所有字段
select name fromsyscolumns where id=object_id('表名')

select name fromsyscolumns where id in (select id fromsysobjects where type = 'u' and name = '表名')

两种方式的效果相同

11:查看与某一个表相关的视图、存储过程、函数
select a.* fromsysobjects a,syscomments b where a.id = b.id and b.text like '%表名%'

12:查看当前数据库中所有存储过程
select name as存储过程名称 from sysobjects where xtype='P'

13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..sysloginswhere name='sa')
或者
select dbid, name AS DB_NAME from master..s
ysdatabases where sid <> 0x01

14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = '
表名'

15:不同服务器数据库之间的数据操作

--创建链接服务器

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)

--1openrowset

--查询示例

select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表

select * into from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表

insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

select *from本地表

--更新本地表

update b

set b.A=a.A

from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join本地表 b

on a.column1=b.column1

--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

--3opendatasource/openrowset

SELECT*

FROMopendatasource( 'SQLOLEDB ','Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta

--把本地表导入远程表

insert opendatasource( 'SQLOLEDB ','Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名

select * from本地表

SQL Server基本函数

SQL Server基本函数

1.字符串函数长度与分析用

1,datalength(Char_expr)返回字符串包含字符数,但不包含后面的空格
2,substring(expression,start,length)取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
3,right(char_expr,int_expr)返回字符串右边第int_expr个字符,还用left于之相反
4,isnull(check_expression,replacement_value)如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类

5,Sp_addtype自定義數據類型
例如:EXEC sp_addtype birthday, datetime, 'NULL'

6,set nocount {on|off}使返回的结果中不包含有关受 Transact-SQL语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT设置是在执行或运行时设置,而不是在分析时设置。SET NOCOUNT ON时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
SET NOCOUNT
OFF时,返回计数常识SQL查询中:from后最多可以跟多少张表或视图:256SQL语句中出现Order by,查询时,先排序,后取SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarcharUnicode码。SQLServer2000同步复制技术实现步骤一、 预备工作1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户--管理工具--计算机管理--用户和组--右键用户--新建用户--建立一个隶属于administrator组的登陆windows的用户(SynUser2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:我的电脑--D:\新建一个目录,名为: PUB--右键这个新建的目录--属性--共享--选择"共享该文件夹"--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser)具有对该文件夹的所有权限--确定3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)开始--程序--管理工具--服务--右键SQLSERVERAGENT--属性--登陆--选择"此账户"--输入或者选择第一步中创建的windows登录用户名(SynUser--"密码"中输入该用户的密码4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)企业管理器--右键SQL实例--属性--安全性--身份验证--选择"SQL Server Windows"--确定5.在发布服务器和订阅服务器上互相注册企业管理器--右键SQL Server--新建SQL Server注册...--下一步--可用的服务器中,输入你要注册的远程服务器名 --添加--下一步--连接使用,选择第二个"SQL Server身份验证"--下一步--输入用户名和密码(SynUser--下一步--选择SQL Server,也可以创建一个新组--下一步--完成6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到) (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)开始--程序--Microsoft SQL Server--客户端网络实用工具--别名--添加--网络库选择"tcp/ip"--服务器别名输入SQL服务器名--连接参数--服务器名称中输入SQL服务器ip地址--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号二、正式配置1、配置发布服务器打开企业管理器,在发布服务器(BCD)上执行以下步骤:(1)[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导(2) [下一步]选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)(3) [下一步]设置快照文件夹采用默认\\servername\Pub(4) [下一步]自定义配置可以选择:,让我设置分发数据库属性启用发布服务器或设置发布设置否,使用下列默认设置(推荐)(5) [下一步]设置分发数据库名称和位置 采用默认值(6) [下一步] 启用发布服务器 选择作为发布的服务器(7) [下一步]选择需要发布的数据库和发布类型(8) [下一步]选择注册订阅服务器(9) [下一步] 完成配置2、创建出版物发布服务器BCD(1)[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令(2)选择要创建出版物的数据库,然后单击[创建发布](3)[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 orACLEACCESS之间进行数据复制。但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表注意:如果前面选择了事务发布 则再这一步中只能选择带有主键的表(6)选择发布名称和描述(7)自定义发布属性 向导提供的选择:是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性否 根据指定方式创建发布 (建议采用自定义的方式)(8)[下一步]选择筛选发布的方式(9)[下一步] 可以选择是否允许匿名订阅1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器]中添加否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅如果仍然需要匿名订阅则用以下解决办法[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项]选择允许匿名请求订阅2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示(10)[下一步]设置快照 代理程序调度(11)[下一步] 完成配置当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库有数据srv1.库名..author有字段:id,name,phone, srv2.库名..author有字段:id,name,telphone,adress要求:srv1.库名..author增加记录则srv1.库名..author记录增加srv1.库名..authorphone字段更新,则srv1.库名..author对应字段telphone更新--*/--大致的处理步骤--1. srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2sql实例名或ip' exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码' go--2. srv1 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动go--然后创建一个作业定时调用上面的同步处理存储过程就行了企业管理器--管理--SQL Server代理--右键作业--新建作业--"常规"项中输入作业名称--"步骤"--新建--"步骤名"中输入步骤名--"类型"中选择"Transact-SQL脚本(TSQL)" --"数据库"选择执行命令的数据库--"命令"中输入要执行的语句: exec p_process --确定--"调度"--新建调度--"名称"中输入调度名称--"调度类型"中选择你的作业执行安排--如果选择"反复出现" --"更改"来设置你的时间安排然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行设置方法:我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. --3.实现同步处理的方法2,定时同步--srv1中创建如下的同步处理存储过程create proc p_processas--更新修改过的数据update b set name=i.name,telphone=i.telphonefrom srv2.库名.dbo.author b,author i where b.id=i.id and(b.name <> i.name or b.telphone <> i.telphone)--插入新增的数据insert srv2.库名.dbo.author(id,name,telphone) select id,name,telphone from author iwhere not exists(select * from srv2.库名.dbo.author where id=i.id) --删除已经删除的数据(如果需要的话) delete bfrom srv2.库名.dbo.author b where not exists(select * from author where id=b.id)go

14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = '
表名'

15:不同服务器数据库之间的数据操作

--创建链接服务器

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)

--1openrowset

--查询示例

select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--生成本地表

select * into from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

--把本地表导入远程表

insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

select *from本地表

--更新本地表

update b

set b.A=a.A

from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join本地表 b

on a.column1=b.column1

--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

--3opendatasource/openrowset

SELECT  *

FROM  opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta

--把本地表导入远程表

insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名

select * from本地表

SQL Server基本函数

1.字符串函数长度与分析用

1,datalength(Char_expr)返回字符串包含字符数,但不包含后面的空格
2,substring(expression,start,length)取子串,字符串的下标是从1start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
3,right(char_expr,int_expr)返回字符串右边第int_expr个字符,还用left于之相反
4,isnull(check_expression,replacement_value )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类

5,Sp_addtype自定義數據類型
例如:EXEC sp_addtype birthday, datetime, 'NULL'

6,set nocount {on|off}
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
SET NOCOUNT  ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。

SET NOCOUNT  OFF 时,返回计数
常识
 
SQL查询中:from后最多可以跟多少张表或视图:256
SQL语句中出现 Order by,查询时,先排序,后取
SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarcharUnicode码。  
        

2010-04-24 10:40

SQL语句导入导出大全

/*******导出到excel
EXEC master..xp_cmdshell'bcp SettleDB.dbo.shanghu out c:emp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""’

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


SELECT cast(cast(
科目编号 as numeric(10,2)) as nvarchar(255))+’ 转换后的别名
FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0’,
’Data Source="c:est.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: t.txt" -c -t ,-U sa -P password’


BULK INSERT
库名..表名
FROM'c: est.txt’
WITH (
FIELDTERMINATOR =';’,
ROWTERMINATOR =''
)


--/* 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:VFP98data;
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
)

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

DECLARE @idoc int
DECLARE @doc varchar(1000)
--sample XML document
SET @doc =’
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied
</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<Urgency>Important</Urgency>
Happy Customer.
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>

-- 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


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

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


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

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


如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2
然后就可以用下面的语句进行插入
注意文件名和目录根据你的实际情况进行修改.

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将文件导入导出到数据库的存储过程:


/*--bcp-
二进制文件的导入导出

支持image,text,ntext字段的导入/导出
image
适合于二进制文件;text,ntext适合于文本数据文件

注意:导入时,将覆盖满足条件的所有行
导出时,将把所有满足条件的行也出到指定文件中

此存储过程仅用bcp实现
邹建 2003.08-----------------*/

/*--调用示例
--
数据导出
exec p_binaryIO'zj’,’’,’’,’acc_
演示数据..tb’,’img’,’c:zj1.dat’

--数据导出
exec p_binaryIO'zj’,’’,’’,’acc_
演示数据..tb’,’img’,’c:zj1.dat’,’’,0
--*/
if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_binaryIO]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)
drop procedure [dbo].[p_binaryIO]
GO

Create proc p_binaryIO
@servename varchar (30),--
服务器名称
@username varchar (30), --
用户名
@password varchar (30), --
密码
@tbname varchar (500), --
数据库..表名
@fdname varchar (30), --
字段名
@fname varchar (1000), --
目录+文件名,处理过程中要使用/覆盖:@filename+.bak
@tj varchar (1000)=’’, --
处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀
@isout bit=1 --1
导出((默认),0导入
AS
declare @fname_in varchar(1000) --bcp
处理应答文件名
,@fsize varchar(20) --
要处理的文件的大小
,@m_tbname varchar(50) --
临时表名
,@sql varchar(8000)

--则取得导入文件的大小
if @isout=1
set @fsize=’0’
else
begin
create table #tb(
可选名 varchar(20),大小 int
,
创建日期 varchar(10),创建时间 varchar(20)
,
上次写操作日期 varchar(10),上次写操作时间 varchar(20)
,
上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int)
insert into #tb
exec master..xp_getfiledetails @fname
select @fsize=
大小 from #tb
drop table #tb
if @fsize is null
begin
print'
文件未找到
return
end

end

--生成数据处理应答文件
set @m_tbname=’[##temp’+cast(newid() as varchar(40))+’]’
set @sql=’select * into'+@m_tbname+’ from(
select null as
类型
union all select 0 as
前缀
union all select'+@fsize+’ as
长度
union all select null as
结束
union all select null as
格式
) a’
exec(@sql)
select @fname_in=@fname+’_temp’
,@sql=’bcp "’+@m_tbname+’" out "’+@fname_in
+’" /S"’+@servename
+case when isnull(@username,’’)=’’ then'’
else'" /U"’+@username end
+’" /P"’+isnull(@password,’’)+’" /c’
exec master..xp_cmdshell @sql
--
删除临时表
set @sql=’drop table'+@m_tbname
exec(@sql)

if @isout=1
begin
set @sql=’bcp "select top 1'+@fdname+’ from'
+@tbname+case isnull(@tj,’’) when'’ then'’
else' where'+@tj end
+’" queryout "’+@fname
+’" /S"’+@servename
+case when isnull(@username,’’)=’’ then'’
else'" /U"’+@username end
+’" /P"’+isnull(@password,’’)
+’" /i"’+@fname_in+’"’
exec master..xp_cmdshell @sql
end
else
begin
--
为数据导入准备临时表
set @sql=’select top 0'+@fdname+’ into'
+@m_tbname+’ from' +@tbname
exec(@sql)

--将数据导入到临时表
set @sql=’bcp "’+@m_tbname+’" in "’+@fname
+’" /S"’+@servename
+case when isnull(@username,’’)=’’ then'’
else'" /U"’+@username end
+’" /P"’+isnull(@password,’’)
+’" /i"’+@fname_in+’"’
exec master..xp_cmdshell @sql

--将数据导入到正式表中
set @sql=’update'+@tbname
+’ set'+@fdname+’=b.’+@fdname
+’ from'+@tbname+’ a,’
+@m_tbname+’ b’
+case isnull(@tj,’’) when'’ then'’
else' where'+@tj end
exec(@sql)

--删除数据处理临时表
set @sql=’drop table'+@m_tbname
end

--删除数据处理应答文件
set @sql=’del'+@fname_in
exec master..xp_cmdshell @sql

go


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

改为如下,不需引号
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’
此句需加引号

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值