SQL SERVER經常使用語法彙總

1、SQL分類

DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)sql

DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)shell

DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)數據庫

 

2、基礎語句

2.一、說明:建立數據庫

create database db-name

2.二、說明:刪除數據庫

drop database db-name 

2.三、說明:備份sql server

--- 建立 備份 USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' --- 開始 備份 BACKUP DATABASE pubs TO testBack

2.四、說明:建立新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)根據已有的表建立新表: A:create table tab_new like tab_old (使用舊錶建立新表) B:create table tab_new as select col1,col2… from tab_old definition only

2.五、說明:刪除新表

drop table tabname

2.六、說明:增長一個列

Alter table tabname add column col type

注:列增長後將不能刪除。DB2中列加上後數據類型也不能改變,惟一能改變的是增長varchar類型的長度。服務器

2.七、說明:添加/刪除主鍵app

Alter table tabname add primary key(col) Alter table tabname drop primary key(col)

2.八、說明:建立/刪除索引dom

create [unique] index idxname on tabname(col….) drop index idxname

注:索引是不可更改的,想更改必須刪除從新建。ide

2.九、說明:建立/刪除視圖函數

create view viewname as select statement drop view viewname

2.十、說明:基本sql語句選擇

複製代碼
查詢:select * from table1 where 範圍 插入:insert into table1(field1,field2) s(1,2) 刪除:delete from table1 where 範圍 更新:update table1 set field1=1 where 範圍 查找:select * from table1 where field1 like ’%1%’ ---like的語法 排序:select * from table1 order by field1,field2 [desc] 總數:select count * as totalcount from table1 求和:select sum(field1) as sum from table1 平均:select avg(field1) as avg from table1 最大:select max(field1) as max from table1 最小:select min(field1) as min from table1
複製代碼

2.十一、說明:高級查詢運算

A: UNION 運算符fetch

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),不消除重複行。

注:使用運算詞的幾個查詢結果行必須是一致的。

2.十二、說明:使用外鏈接

A、left 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

B:right outer join: 右外鏈接(右鏈接):結果集既包括鏈接表的匹配鏈接行,也包括右鏈接表的全部行。

C:full outer join: 全外鏈接:不只包括符號鏈接表的匹配行,還包括兩個鏈接表中的全部記錄。

 

補充:

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)、說明:子查詢(表名1:a 表名2:b)

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)、說明:外鏈接查詢(表名1:a 表名2:b)

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)、說明:在線視圖查詢(表名1:a )

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

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 中但不在 TableB和TableC 中的行並消除全部重複行而派生出一個結果表

(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)、說明:列示type、vender、pcs字段,以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)、說明:選擇從10到15的記錄

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

 

3、sql技巧

3.一、如何刪除一個表中重複的記錄?

複製代碼
create table a_dist(id int,name varchar(20)) insert into a_dist values(1,'abc') insert into a_dist values(1,'abc') insert into a_dist values(1,'abc') insert into a_dist values(1,'abc') exec up_distinct 'a_dist','id' select * from a_dist
複製代碼

 存儲過程以下:

複製代碼
 1 create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))  2 --f_key表示是分組字段﹐即主鍵字段  3  4 as  5 begin  6 declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer  7 select @sql = 'declare cur_rows cursor for select '+@f_key+' ,count(*) from ' +@t_name +' group by ' +@f_key +' having count(*) > 1'  8 exec(@sql)  9 10 open cur_rows 11 fetch cur_rows into @id,@max 12 13 while @@fetch_status=0 14 begin 15 select @max = @max -1 16 set rowcount @max 17 select @type = xtype from syscolumns where id=object_id(@t_name) and name=@f_key 18 if @type=56 19 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+ @id 20 if @type=167 21 select @sql = 'delete from '+@t_name+' where ' + @f_key+' = '+''''+ @id +'''' 22 exec(@sql) 23 24 fetch cur_rows into @id,@max 25 end 26 27 close cur_rows 28 deallocate cur_rows 29 30 set rowcount 0 31 end 32 33 select * from systypes 34 select * from syscolumns where id = object_id('a_dist')
複製代碼

3.二、查詢數據的最大排序問題(只能用一條語句寫)

複製代碼
CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0)) insert into hard values ('A','1',3) insert into hard values ('A','2',4) insert into hard values ('A','4',2) insert into hard values ('A','6',9) insert into hard values ('B','1',4) insert into hard values ('B','2',5) insert into hard values ('B','3',6) insert into hard values ('C','3',4) insert into hard values ('C','6',7) insert into hard values ('C','2',3)
複製代碼

要求查詢出來的結果以下: 

複製代碼
qu co je
----------- ----------- -----
A 6 9
A 2 4
B 3 6
B 2 5
C 6 7
C 3 4

就是要按qu分組,每組中取je最大的前2位,且只能用一句sql語句。
複製代碼
select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je)

3.三、求刪除重複記錄的sql語句

怎樣把具備相同字段的記錄刪除,只留下一條。

例如,表test裏有id,name字段

若是有name相同的記錄 只留下一條,其他的刪除。

name的內容不定,相同的記錄數不定。

==============================

一個完整的解決方案:

複製代碼
1)將重複的記錄記入temp1表: select [標誌字段id],count(*) into temp1 from [表名] group by [標誌字段id] having count(*)>1 2)將不重複的記錄記入temp1表: insert temp1 select [標誌字段id],count(*) from [表名] group by [標誌字段id] having count(*)=1 3)做一個包含全部不重複記錄的表: select * into temp2 from [表名] where 標誌字段id in(select 標誌字段id from temp1) 4)刪除重複表: delete [表名] 5)恢復表: insert [表名] select * from temp2 6)刪除臨時表: drop table temp1 drop table temp2
複製代碼

3.四、行列轉換--普通

複製代碼
假設有張學生成績表(CJ)以下

Name Subject Result
張三  語文    80
張三  數學    90
張三  物理    85
李四  語文    85
李四  數學    92
李四  物理    82

想變成

姓名 語文 數學 物理
張三 80   90  85
李四 85   92  82
複製代碼
複製代碼
declare @sql varchar(4000) set @sql = 'select Name' select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']' from (select distinct Subject from CJ) as a select @sql = @sql+' from test group by name' exec(@sql)
複製代碼

3.五、行列轉換--合併

複製代碼
有表A,

id pid
1 1
1 2
1 3
2 1
2 2
3 1

如何化成表B:

id pid
1 1,2,3
2 1,2
3 1
複製代碼

建立一個合併的函數

複製代碼
create function fmerg(@id int) returns varchar(8000) as begin declare @str varchar(8000) set @str='' select @str=@str+','+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1) return(@str) End go
複製代碼

調用自定義函數獲得結果

select distinct id,dbo.fmerg(id) from 表A

 

3.六、如何取得一個數據表的全部列名

先從SYSTEMOBJECT系統表中取得數據表的SYSTEMID,而後再SYSCOLUMN表中取得該數據表的全部列名。

SQL語句以下:

複製代碼
declare @objid int,@objname char(40) set @objname = 'tablename' select @objid = id from sysobjects where id = object_id(@objname) select 'Column_name' = name from syscolumns where id = @objid order by colid
複製代碼

 

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='users'

 

3.七、經過SQL語句來更改用戶的密碼

修改別人的,須要sysadmin role
EXEC sp_password NULL, 'newpassword', 'User' 若是賬號爲SA執行 EXEC sp_password NULL, 'newpassword', sa

3.八、怎麼判斷出一個表的哪些字段不容許爲空

select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename

 

3.九、如何在數據庫裏找到含有相同字段的表

a. 查已知列名的狀況

SELECT b.name as TableName,a.name as columnname From syscolumns a INNER JOIN sysobjects b ON a.id=b.id AND b.type='U' AND a.name='字段名'

 

b.未知列名查全部在不一樣表出現過的列名

複製代碼
Select o.name As tablename,s1.name As columnname From syscolumns s1, sysobjects o Where s1.id = o.id And o.type = 'U' And Exists ( Select 1 From syscolumns s2 Where s1.name = s2.name And s1.id <> s2.id )
複製代碼

 

3.十、查詢第xxx行數據

假設id是主鍵:

select * from (select top xxx * from yourtable) aa where not exists(select 1 from (select top xxx-1 * from yourtable) bb where aa.id=bb.id) 

若是使用遊標也是能夠的

fetch absolute [number] from [cursor_name]

 

注:行數爲絕對行數

3.十一、日期計算

複製代碼
a. 一個月的第一天
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) b. 本週的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) c. 一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) d. 季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) e. 上個月的最後一天 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) f. 去年的最後一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) g. 本月的最後一天 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) h. 本月的第一個星期一 select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 0) i. 本年的最後一天 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。
複製代碼

 

3.十二、獲取表結構[把 'sysobjects' 替換 成 'tablename' 便可]

複製代碼
SELECT CASE IsNull(I.name, '') When '' Then '' Else '*' End as IsPK, Object_Name(A.id) as t_name, A.name as c_name, IsNull(SubString(M.text, 1, 254), '') as pbc_init, T.name as F_DataType, CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), '') WHEN '' Then Cast(A.prec as varchar) ELSE Cast(A.prec as varchar) + ',' + Cast(A.scale as varchar) END as F_Scale, A.isnullable as F_isNullAble FROM Syscolumns as A JOIN Systypes as T ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') ) LEFT JOIN ( SysIndexes as I JOIN Syscolumns as A1 ON ( I.id = A1.id and A1.id = object_id('sysobjects') and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) ) ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) ) LEFT JOIN SysComments as M ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint') = 1 ) ORDER BY A.Colid ASC
複製代碼

3.1三、提取數據庫內全部表的字段詳細說明的SQL語句

複製代碼
SELECT (case when a.colorder=1 then d.name else '' end) N'表名', a.colorder N'字段序號', a.name N'字段名', (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then ''else '' end) N'標識', (case when (SELECT count(*) FROM sysobjects WHERE (name in (SELECT name FROM sysindexes WHERE (id = a.id) AND (indid in (SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid in (SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name))))))) AND (xtype = 'PK'))>0 then '' else '' end) N'主鍵', b.name N'類型', a.length N'佔用字節數', COLUMNPROPERTY(a.id,a.name,'PRECISION') as N'長度', isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as N'小數位數', (case when a.isnullable=1 then ''else '' end) N'容許空', isnull(e.text,'') N'默認值', isnull(g.[value],'') AS N'字段說明' FROM syscolumns a left join systypes b on a.xtype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' left join syscomments e on a.cdefault=e.id left join sysproperties g on a.id=g.id AND a.colid = g.smallid order by object_name(a.id),a.colorder
複製代碼

3.1四、快速獲取表test的記錄總數[對大容量表很是有效]

快速獲取表test的記錄總數:

複製代碼
select rows from sysindexes where id = object_id('test') and indid in (0,1) update 2 set KHXH=(ID+1)\2 2行遞增編號 update [23] set id1 = 'No.'+right('00000000'+id,6) where id not like 'No%' //遞增 update [23] set id1= 'No.'+right('00000000'+replace(id1,'No.',''),6) //補位遞增 delete from [1] where (id%2)=1  奇數 替換表名字段 update [1] set domurl = replace(domurl,'Upload/Imgswf/','Upload/Photo/') where domurl like '%Upload/Imgswf/%' 截位 SELECT LEFT(表名, 5) 截位 SELECT LEFT(表名, 5)
複製代碼

4、(MS SQL Server)SQL語句導入導出大全

4.一、導出到excel

EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'

 

4.二、 導入Excel

複製代碼
SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\test.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:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','Excel 5.0;HDR=YES;DATABASE=c:\Book1.xls',Sheet1$) HDR=YES;Excel第一行當成標題行 HDR=NO;第一行不當成標題行
複製代碼

4.三、 導入文本文件

EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword

4.四、 導出文本文件

複製代碼
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]') --*/
複製代碼

4.五、導入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
複製代碼

 

4.六、 導出到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表的文件名.

 

4.七、導出到Access

insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'',A表) select * from 數據庫名..B表

4.八、導入Access

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

4.九、 導入 xml文件

 

複製代碼
 1 DECLARE @idoc int  2 DECLARE @doc varchar(1000)  3  4 --sample XML document  5 SET @doc ='  6 <root>  7 <Customer cid= "C1" name="Janine" city="Issaquah">  8 <Order oid="O1" date="1/20/1996" amount="3.5" />  9 <Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied 10 </Order> 11 </Customer> 12 <Customer cid="C2" name="Ursula" city="Oelde" > 13 <Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue 14 white red"> 15 <Urgency>Important</Urgency> 16 Happy Customer. 17 </Order> 18 <Order oid="O4" date="1/20/1996" amount="10000"/> 19 </Customer> 20 </root> 21 ' 22 23 -- Create an internal representation of the XML document. 24 EXEC sp_xml_preparedocument @idoc OUTPUT, @doc 25 26 27 -- Execute a SELECT statement using OPENXML rowset provider. 28 SELECT * 29 FROM OPENXML (@idoc, '/root/Customer/Order', 1) 30 WITH (oid char(5), 31 amount float, 32 comment ntext 'text()') 33 34 EXEC sp_xml_removedocument @idoc
複製代碼

 

 

 

4.十、導整個數據庫

用bcp實現的存儲過程

實現數據導入/導出的存儲過程

根據不一樣的參數,能夠實現導入/導出整個數據庫/單個表

調用示例:

4.10.一、導出調用示例

----導出單個表

exec file2table 'zj','','','xzkh_sa..地區資料','c:\zj.txt',1

 

----導出整個數據庫

exec file2table 'zj','','','xzkh_sa','C:\docman',

4.10.二、導入調用示例

----導入單個表

exec file2table 'zj','','','xzkh_sa..地區資料','c:\zj.txt',0

 

----導入整個數據庫

exec file2table 'zj','','','xzkh_sa','C:\docman',

 

複製代碼
 1 if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1)  2 drop procedure File2Table  3 go  4 create procedure File2Table  5 @servername varchar(200) --服務器名  6 ,@username varchar(200) --用戶名,若是用NT驗證方式,則爲空''  7 ,@password varchar(200) --密碼  8 ,@tbname varchar(500) --數據庫.dbo.表名,若是不指定:.dbo.表名,則導出數據庫的全部用戶表  9 ,@filename varchar(1000) --導入/導出路徑/文件名,若是@tbname參數指明是導出整個數據庫,則這個參數是文件存放路徑,文件名自動用表名.txt 10 ,@isout bit --1爲導出,0爲導入 11 as 12 declare @sql varchar(8000) 13 if @tbname like '%.%.%' --若是指定了表名,則直接導出單個表 14 begin 15 set @sql='bcp '+@tbname 16 +case when @isout=1 then ' out ' else ' in ' end 17 +' "'+@filename+'" /w' 18 +' /S '+@servername 19 +case when isnull(@username,'')='' then '' else ' /U '+@username end 20 +' /P '+isnull(@password,'') 21 22 exec master..xp_cmdshell @sql 23 24 end 25 else 26 begin --導出整個數據庫,定義遊標,取出全部的用戶表 27 28 declare @m_tbname varchar(250) 29 if right(@filename,1)<>'\' set @filename=@filename+'\' 30 set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U''' 31 exec(@m_tbname) 32 33 open #tb 34 35 fetch next from #tb into @m_tbname 36 while @@fetch_status=0 37 begin 38 set @sql='bcp '+@tbname+'..'+@m_tbname 39 +case when @isout=1 then ' out ' else ' in ' end 40 +' "'+@filename+@m_tbname+'.txt " /w' 41 +' /S '+@servername 42 +case when isnull(@username,'')='' then '' else ' /U '+@username end 43 +' /P '+isnull(@password,'') 44 45 exec master..xp_cmdshell @sql 46 47 fetch next from #tb into @m_tbname 48 end 49 50 close #tb 51 deallocate #tb 52 end 53 go
複製代碼

 

 

 

4.十一、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) 

4.十二、用bcp將文件導入導出到數據庫的存儲過程:

bcp-二進制文件的導入導出

支持image,text,ntext字段的導入/導出

image適合於二進制文件;text,ntext適合於文本數據文件

 

注意:導入時,將覆蓋知足條件的全部行

導出時,將把全部知足條件的行也出到指定文件中

 

此存儲過程僅用bcp實現

 

/*--調用示例

--數據導出

exec p_binaryIO 'zj','','','acc_演示數據..tb','img','c:\zj1.dat

--數據導出

exec p_binaryIO 'zj','','','acc_演示數據..tb','img','c:\zj1.dat','',0

 

--*/

 

View Code

 

 生成數據處理應答文件

複製代碼
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' 此句需加引號
相關文章
相關標籤/搜索