DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE)sql
DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT)shell
DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)數據庫
create database db-name
drop database db-name
--- 建立 備份 USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat' --- 開始 備份 BACKUP DATABASE pubs TO testBack
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
drop table tabname
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
查詢: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
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),不消除重複行。
注:使用運算詞的幾個查詢結果行必須是一致的。
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())>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 中但不在 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
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')
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)
怎樣把具備相同字段的記錄刪除,只留下一條。
例如,表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
假設有張學生成績表(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)
有表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
先從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'
修改別人的,須要sysadmin role
EXEC sp_password NULL, 'newpassword', 'User' 若是賬號爲SA執行 EXEC sp_password NULL, 'newpassword', sa
select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE='NO' and TABLE_NAME=tablename
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 )
假設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]
注:行數爲絕對行數
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))。
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
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
快速獲取表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)
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""'
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;第一行不當成標題行
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]') --*/
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
若是要導出數據到已經生成結構(即現存的)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表的文件名.
insert into openrowset('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'',A表) select * from 數據庫名..B表
insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', 'x:\A.mdb';'admin';'',A表)
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
用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
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
想用
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-二進制文件的導入導出
支持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
--*/
生成數據處理應答文件
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' 此句需加引號