﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-elva-随笔分类-SQl</title><link>http://www.cppblog.com/elva/category/5703.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 22:47:32 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 22:47:32 GMT</pubDate><ttl>60</ttl><item><title>精妙SQL语句</title><link>http://www.cppblog.com/elva/archive/2007/12/06/37896.html</link><dc:creator>叶子</dc:creator><author>叶子</author><pubDate>Thu, 06 Dec 2007 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/elva/archive/2007/12/06/37896.html</guid><wfw:comment>http://www.cppblog.com/elva/comments/37896.html</wfw:comment><comments>http://www.cppblog.com/elva/archive/2007/12/06/37896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/elva/comments/commentRss/37896.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/elva/services/trackbacks/37896.html</trackback:ping><description><![CDATA[<font face=Arial size=2>说明：复制表(只复制结构,源表名：a&nbsp;新表名：b)&nbsp;</font>
<p><font face=Arial size=2>SQL:&nbsp;select&nbsp;*&nbsp;into&nbsp;b&nbsp;from&nbsp;a&nbsp;where&nbsp;1&lt;&gt;1&nbsp;</font></p>
<p><font face=Arial size=2>说明：拷贝表(拷贝数据,源表名：a&nbsp;目标表名：b)&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;insert&nbsp;into&nbsp;b(a,&nbsp;b,&nbsp;c)&nbsp;select&nbsp;d,e,f&nbsp;from&nbsp;b;&nbsp;</font></p>
<p><font face=Arial size=2>说明：显示文章、提交人和最后回复时间&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;select&nbsp;a.title,a.username,b.adddate&nbsp;from&nbsp;table&nbsp;a,(select&nbsp;max(adddate)&nbsp;adddate&nbsp;from&nbsp;table&nbsp;where&nbsp;table.title=a.title)&nbsp;b&nbsp;</font></p>
<p><font face=Arial size=2>说明：外连接查询(表名1：a&nbsp;表名2：b)&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;select&nbsp;a.a,&nbsp;a.b,&nbsp;a.c,&nbsp;b.c,&nbsp;b.d,&nbsp;b.f&nbsp;from&nbsp;a&nbsp;LEFT&nbsp;OUT&nbsp;JOIN&nbsp;b&nbsp;ON&nbsp;a.a&nbsp;=&nbsp;b.c&nbsp;</font></p>
<p><font face=Arial size=2>说明：日程安排提前五分钟提醒&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;select&nbsp;*&nbsp;from&nbsp;日程安排&nbsp;where&nbsp;datediff('minute',f开始时间,getdate())&gt;5&nbsp;</font></p>
<p><font face=Arial size=2>说明：两张关联表，删除主表中已经在副表中没有的信息&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;</font></p>
<p><font face=Arial size=2>delete&nbsp;from&nbsp;info&nbsp;where&nbsp;not&nbsp;exists&nbsp;(&nbsp;select&nbsp;*&nbsp;from&nbsp;infobz&nbsp;where&nbsp;info.infid=infobz.infid&nbsp;)&nbsp;</font></p>
<p><font face=Arial size=2>说明：--&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;</font></p>
<p><font face=Arial size=2>SELECT&nbsp;A.NUM,&nbsp;A.NAME,&nbsp;B.UPD_DATE,&nbsp;B.PREV_UPD_DATE&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;TABLE1,&nbsp;</font></p>
<p><font face=Arial size=2>(SELECT&nbsp;X.NUM,&nbsp;X.UPD_DATE,&nbsp;Y.UPD_DATE&nbsp;PREV_UPD_DATE&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;(SELECT&nbsp;NUM,&nbsp;UPD_DATE,&nbsp;INBOUND_QTY,&nbsp;STOCK_ONHAND&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;TABLE2&nbsp;</font></p>
<p><font face=Arial size=2>WHERE&nbsp;TO_CHAR(UPD_DATE,'YYYY/MM')&nbsp;=&nbsp;TO_CHAR(SYSDATE,&nbsp;'YYYY/MM'))&nbsp;X,&nbsp;</font></p>
<p><font face=Arial size=2>(SELECT&nbsp;NUM,&nbsp;UPD_DATE,&nbsp;STOCK_ONHAND&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;TABLE2&nbsp;</font></p>
<p><font face=Arial size=2>WHERE&nbsp;TO_CHAR(UPD_DATE,'YYYY/MM')&nbsp;=&nbsp;</font></p>
<p><font face=Arial size=2>TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,&nbsp;'YYYY/MM')&nbsp;||&nbsp;'/01','YYYY/MM/DD')&nbsp;-&nbsp;1,&nbsp;'YYYY/MM')&nbsp;)&nbsp;Y,&nbsp;</font></p>
<p><font face=Arial size=2>WHERE&nbsp;X.NUM&nbsp;=&nbsp;Y.NUM&nbsp;（+）&nbsp;</font></p>
<p><font face=Arial size=2>AND&nbsp;X.INBOUND_QTY&nbsp;+&nbsp;NVL(Y.STOCK_ONHAND,0)&nbsp;&lt;&gt;&nbsp;X.STOCK_ONHAND&nbsp;)&nbsp;B&nbsp;</font></p>
<p><font face=Arial size=2>WHERE&nbsp;A.NUM&nbsp;=&nbsp;B.NUM&nbsp;</font></p>
<p><font face=Arial size=2>说明：--&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;</font></p>
<p><font face=Arial size=2>select&nbsp;*&nbsp;from&nbsp;studentinfo&nbsp;where&nbsp;not&nbsp;exists(select&nbsp;*&nbsp;from&nbsp;student&nbsp;where&nbsp;studentinfo.id=student.id)&nbsp;and&nbsp;系名称='"&amp;strdepartmentname&amp;"'&nbsp;and&nbsp;专业名称='"&amp;strprofessionname&amp;"'&nbsp;order&nbsp;by&nbsp;性别,生源地,高考总成绩&nbsp;</font></p>
<p><font face=Arial size=2>说明：&nbsp;</font></p>
<p><font face=Arial size=2>从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源）&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;</font></p>
<p><font face=Arial size=2>SELECT&nbsp;a.userper,&nbsp;a.tel,&nbsp;a.standfee,&nbsp;TO_CHAR(a.telfeedate,&nbsp;'yyyy')&nbsp;AS&nbsp;telyear,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'01',&nbsp;a.factration))&nbsp;AS&nbsp;JAN,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'02',&nbsp;a.factration))&nbsp;AS&nbsp;FRI,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'03',&nbsp;a.factration))&nbsp;AS&nbsp;MAR,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'04',&nbsp;a.factration))&nbsp;AS&nbsp;APR,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'05',&nbsp;a.factration))&nbsp;AS&nbsp;MAY,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'06',&nbsp;a.factration))&nbsp;AS&nbsp;JUE,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'07',&nbsp;a.factration))&nbsp;AS&nbsp;JUL,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'08',&nbsp;a.factration))&nbsp;AS&nbsp;AGU,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'09',&nbsp;a.factration))&nbsp;AS&nbsp;SEP,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'10',&nbsp;a.factration))&nbsp;AS&nbsp;OCT,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'11',&nbsp;a.factration))&nbsp;AS&nbsp;NOV,&nbsp;</font></p>
<p><font face=Arial size=2>SUM(decode(TO_CHAR(a.telfeedate,&nbsp;'mm'),&nbsp;'12',&nbsp;a.factration))&nbsp;AS&nbsp;DEC&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;(SELECT&nbsp;a.userper,&nbsp;a.tel,&nbsp;a.standfee,&nbsp;b.telfeedate,&nbsp;b.factration&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;TELFEESTAND&nbsp;a,&nbsp;TELFEE&nbsp;b&nbsp;</font></p>
<p><font face=Arial size=2>WHERE&nbsp;a.tel&nbsp;=&nbsp;b.telfax)&nbsp;a&nbsp;</font></p>
<p><font face=Arial size=2>GROUP&nbsp;BY&nbsp;a.userper,&nbsp;a.tel,&nbsp;a.standfee,&nbsp;TO_CHAR(a.telfeedate,&nbsp;'yyyy')&nbsp;</font></p>
<p><font face=Arial size=2>说明：四表联查问题：&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;select&nbsp;*&nbsp;from&nbsp;a&nbsp;left&nbsp;inner&nbsp;join&nbsp;b&nbsp;on&nbsp;a.a=b.b&nbsp;right&nbsp;inner&nbsp;join&nbsp;c&nbsp;on&nbsp;a.a=c.c&nbsp;inner&nbsp;join&nbsp;d&nbsp;on&nbsp;a.a=d.d&nbsp;where&nbsp;.....&nbsp;</font></p>
<p><font face=Arial size=2>说明：得到表中最小的未使用的ID号&nbsp;</font></p>
<p><font face=Arial size=2>SQL:&nbsp;</font></p>
<p><font face=Arial size=2>SELECT&nbsp;(CASE&nbsp;WHEN&nbsp;EXISTS(SELECT&nbsp;*&nbsp;FROM&nbsp;Handle&nbsp;b&nbsp;WHERE&nbsp;b.HandleID&nbsp;=&nbsp;1)&nbsp;THEN&nbsp;MIN(HandleID)&nbsp;+&nbsp;1&nbsp;ELSE&nbsp;1&nbsp;END)&nbsp;as&nbsp;HandleID&nbsp;</font></p>
<p><font face=Arial size=2>FROM&nbsp;Handle&nbsp;</font></p>
<p><font face=Arial size=2>WHERE&nbsp;NOT&nbsp;HandleID&nbsp;IN&nbsp;(SELECT&nbsp;a.HandleID&nbsp;-&nbsp;1&nbsp;FROM&nbsp;Handle&nbsp;a)</font></p>
<p><font face=Arial size=2>====================================</font></p>
<p>SQL语句技巧<br>1、一个SQL语句的问题:行列转换<br>&nbsp;&nbsp; select * from v_temp<br>上面的视图结果如下:<br>user_name role_name<br>-------------------------<br>系统管理员 管理员 <br>feng 管理员 <br>feng 一般用户 <br>test 一般用户 <br>想把结果变成这样:<br>user_name role_name<br>---------------------------<br>系统管理员 管理员 <br>feng 管理员,一般用户 <br>test 一般用户<br>===================<br>create table a_test(name varchar(20),role2 varchar(20))<br>insert into a_test values('李','管理員')<br>insert into a_test values('張','管理員')<br>insert into a_test values('張','一般用戶')<br>insert into a_test values('常','一般用戶')</p>
<p>create function join_str(@content varchar(100))<br>returns varchar(2000)<br>as<br>begin<br>declare @str varchar(2000)<br>set @str=''<br>select @str=@str+','+rtrim(role2) from a_test where [name]=@content<br>select @str=right(@str,len(@str)-1)<br>return @str<br>end<br>go</p>
<p>--调用：<br>select [name],dbo.join_str([name]) role2 from a_test group by [name]</p>
<p>--select distinct name,dbo.uf_test(name) from a_test</p>
<p>2、求助！快速比较结构相同的两表<br>结构相同的两表，一表有记录3万条左右，一表有记录2万条左右，我怎样快速查找两表的不同记录？<br>============================<br>给你一个测试方法，从northwind中的orders表取数据。<br>select * into n1 from orders<br>select * into n2 from orders</p>
<p>select * from n1<br>select * from n2</p>
<p>--添加主键，然后修改n1中若干字段的若干条<br>alter table n1 add constraint pk_n1_id primary key (OrderID)<br>alter table n2 add constraint pk_n2_id primary key (OrderID)</p>
<p>select OrderID from (select * from n1<br>union <br>select * from n2) a group by OrderID having count(*) &gt; 1</p>
<p>应该可以，而且将不同的记录的ID显示出来。<br>下面的适用于双方记录一样的情况，</p>
<p>select * from n1 where orderid in<br>(<br>select OrderID from (select * from n1<br>union <br>select * from n2) a group by OrderID having count(*) &gt; 1<br>) <br>至于双方互不存在的记录是比较好处理的<br>--删除n1,n2中若干条记录<br>delete from n1 where orderID in ('10728','10730')<br>delete from n2 where orderID in ('11000','11001')</p>
<p>--*************************************************************<br>-- 双方都有该记录却不完全相同<br>select * from n1 where orderid in<br>(<br>select OrderID from (select * from n1<br>union <br>select * from n2) a group by OrderID having count(*) &gt; 1<br>)<br>union<br>--n2中存在但在n1中不存的在10728,10730<br>select * from n1 where OrderID not in (select OrderID from n2)<br>union<br>--n1中存在但在n2中不存的在11000,11001<br>select * from n2 where OrderID not in (select OrderID from n1)<br>3.<br>四种方法取表里n到m条纪录：</p>
<p>1.<br>select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入<br>set rowcount n<br>select * from 表变量 order by columnname desc</p>
<p><br>2.<br>select top n * from <br>(select top m * from tablename order by columnname) a<br>order by columnname desc</p>
<p><br>3.如果tablename里没有其他identity列，那么：<br>select identity(int) id0,* into #temp from tablename</p>
<p>取n到m条的语句为：<br>select * from #temp where id0 &gt;=n and id0 &lt;= m</p>
<p>如果你在执行select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行：<br>exec sp_dboption 你的DB名字,'select into/bulkcopy',true</p>
<p><br>4.如果表里有identity属性，那么简单：<br>select * from tablename where identitycol between n and m <br>5.如何删除一个表中重复的记录？<br>create table a_dist(id int,name varchar(20))</p>
<p>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')</p>
<p>exec up_distinct 'a_dist','id'</p>
<p>select * from a_dist</p>
<p>create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))<br>--f_key表示是分組字段﹐即主鍵字段<br>as<br>begin<br>declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br>select @sql = 'declare cur_rows cursor for select <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#102;&#95;&#107;&#101;&#121;&#43;&#39;"><font color=#000080><u>'+@f_key+'</u></font></a> ,count(*) from ' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#116;&#95;&#110;&#97;&#109;&#101;"><font color=#000080><u>+@t_name</u></font></a> +' group by ' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#102;&#95;&#107;&#101;&#121;"><font color=#000080><u>+@f_key</u></font></a> +' having count(*) &gt; 1'<br>exec(@sql)<br>open cur_rows <br>fetch cur_rows into @id,@max <br>while @@fetch_status=0 <br>begin <br>select @max = @max -1 <br>set rowcount @max <br>select @type = xtype from syscolumns where id=object_id(@t_name) and <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#97;&#109;&#101;&#61;&#64;&#102;&#95;&#107;&#101;&#121;"><font color=#000080><u>name=@f_key</u></font></a><br>if @type=56<br>select @sql = 'delete from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#95;&#110;&#97;&#109;&#101;&#43;&#39;"><font color=#000080><u>'+@t_name+'</u></font></a> where ' + @f_key+' = '+ @id <br>if @type=167<br>select @sql = 'delete from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#95;&#110;&#97;&#109;&#101;&#43;&#39;"><font color=#000080><u>'+@t_name+'</u></font></a> where ' + @f_key+' = '+''''+ @id +'''' <br>exec(@sql)<br>fetch cur_rows into @id,@max <br>end <br>close cur_rows <br>deallocate cur_rows<br>set rowcount 0<br>end</p>
<p>select * from systypes<br>select * from syscolumns where id = object_id('a_dist')</p>
<p>6.查询数据的最大排序问题（只能用一条语句写） <br>CREATE TABLE hard (qu char (11) ,co char (11) ,je numeric(3, 0)) </p>
<p>insert into hard values ('A','1',3)<br>insert into hard values ('A','2',4)<br>insert into hard values ('A','4',2)<br>insert into hard values ('A','6',9)<br>insert into hard values ('B','1',4)<br>insert into hard values ('B','2',5)<br>insert into hard values ('B','3',6)<br>insert into hard values ('C','3',4)<br>insert into hard values ('C','6',7)<br>insert into hard values ('C','2',3)</p>
<p><br>要求查询出来的结果如下：</p>
<p>qu co je <br>----------- ----------- ----- <br>A 6 9<br>A 2 4<br>B 3 6<br>B 2 5<br>C 6 7<br>C 3 4</p>
<p><br>就是要按qu分组，每组中取je最大的前2位！！<br>而且只能用一句sql语句！！！<br>select * from hard a where je in (select top 2 je from hard b where a.qu=b.qu order by je) <br>7.求删除重复记录的sql语句？ <br>怎样把具有相同字段的纪录删除，只留下一条。<br>例如，表test里有id,name字段<br>如果有name相同的记录 只留下一条，其余的删除。<br>name的内容不定，相同的记录数不定。<br>有没有这样的sql语句？<br>==============================<br>A:一个完整的解决方案：</p>
<p>将重复的记录记入temp1表:<br>select [标志字段id],count(*) into temp1 from [表名]<br>group by [标志字段id]<br>having count(*)&gt;1</p>
<p>2、将不重复的记录记入temp1表:<br>insert temp1<br>select [标志字段id],count(*) from [表名]<br>group by [标志字段id]<br>having count(*)=1</p>
<p>3、作一个包含所有不重复记录的表：<br>select * into temp2 from [表名]<br>where 标志字段id in(select 标志字段id from temp1)</p>
<p>4、删除重复表:<br>delete [表名]</p>
<p>5、恢复表：<br>insert [表名]<br>select * from temp2</p>
<p>6、删除临时表:<br>drop table temp1<br>drop table temp2<br>================================<br>B:<br>create table a_dist(id int,name varchar(20))</p>
<p>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')<br>insert into a_dist values(1,'abc')</p>
<p>exec up_distinct 'a_dist','id'</p>
<p>select * from a_dist</p>
<p>create procedure up_distinct(@t_name varchar(30),@f_key varchar(30))<br>--f_key表示是分組字段﹐即主鍵字段<br>as<br>begin<br>declare @max integer,@id varchar(30) ,@sql varchar(7999) ,@type integer<br>select @sql = 'declare cur_rows cursor for select <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#102;&#95;&#107;&#101;&#121;&#43;&#39;"><font color=#000080><u>'+@f_key+'</u></font></a> ,count(*) from ' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#116;&#95;&#110;&#97;&#109;&#101;"><font color=#000080><u>+@t_name</u></font></a> +' group by ' <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#43;&#64;&#102;&#95;&#107;&#101;&#121;"><font color=#000080><u>+@f_key</u></font></a> +' having count(*) &gt; 1'<br>exec(@sql)<br>open cur_rows <br>fetch cur_rows into @id,@max <br>while @@fetch_status=0 <br>begin <br>select @max = @max -1 <br>set rowcount @max <br>select @type = xtype from syscolumns where id=object_id(@t_name) and <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#110;&#97;&#109;&#101;&#61;&#64;&#102;&#95;&#107;&#101;&#121;"><font color=#000080><u>name=@f_key</u></font></a><br>if @type=56<br>select @sql = 'delete from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#95;&#110;&#97;&#109;&#101;&#43;&#39;"><font color=#000080><u>'+@t_name+'</u></font></a> where ' + @f_key+' = '+ @id <br>if @type=167<br>select @sql = 'delete from <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#43;&#64;&#116;&#95;&#110;&#97;&#109;&#101;&#43;&#39;"><font color=#000080><u>'+@t_name+'</u></font></a> where ' + @f_key+' = '+''''+ @id +'''' <br>exec(@sql)<br>fetch cur_rows into @id,@max <br>end <br>close cur_rows <br>deallocate cur_rows<br>set rowcount 0<br>end</p>
<p>select * from systypes<br>select * from syscolumns where id = object_id('a_dist')</p>
<br><br>
<div class=postText>SQL import&amp; export command <br><br>EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""' <br><br>/*********** 导入Excel <br>SELECT * <br>FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', <br>'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions <br><br>/*动态文件名 <br>declare @fn varchar(20),@s varchar(1000) <br>set @fn = 'c:\test.xls' <br>set @s ='''Microsoft.Jet.OLEDB.4.0'', <br>''Data Source="'+@fn+'";User ID=Admin;Password=;Extended properties=Excel 5.0''' <br>set @s = 'SELECT * FROM OpenDataSource ('+@s+')...sheet1$' <br>exec(@s) <br>*/ <br><br>SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+'　' 转换后的别名 <br>FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', <br>'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions <br><br>/********************** EXCEL导到远程SQL <br>insert OPENDATASOURCE( <br>'SQLOLEDB', <br>'Data Source=远程ip;User ID=sa;Password=密码' <br>).库名.dbo.表名 (列名1,列名2) <br>SELECT 列名1,列名2 <br>FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', <br>'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions <br><br>/** 导入文本文件 <br>EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword' <br><br>/** 导出文本文件 <br>EXEC master..xp_cmdshell 'bcp dbname..tablename out c:\DT.txt -c -Sservername -Usa -Ppassword' <br>或 <br>EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword' <br><br>导出到TXT文本，用逗号分开 <br>exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password' <br><br>BULK INSERT 库名..表名 <br>FROM 'c:\test.txt' <br>WITH ( <br>FIELDTERMINATOR = ';', <br>ROWTERMINATOR = '\n' <br>) <br><br>--/* dBase IV文件 <br>select * from <br>OPENROWSET('MICROSOFT.JET.OLEDB.4.0' <br>,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]') <br>--*/ <br><br>--/* dBase III文件 <br>select * from <br>OPENROWSET('MICROSOFT.JET.OLEDB.4.0' <br>,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]') <br>--*/ <br><br>--/* FoxPro 数据库 <br>select * from openrowset('MSDASQL', <br>'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', <br>'select * from [aa.DBF]') <br>--*/ <br><br>/**************导入DBF文件****************/ <br>select * from openrowset('MSDASQL', <br>'Driver=Microsoft Visual FoxPro Driver; <br>SourceDB=e:\VFP98\data; <br>SourceType=DBF', <br>'select * from customer where country != "USA" order by country') <br>go <br>/***************** 导出到DBF ***************/ <br>如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句 <br><br>insert into openrowset('MSDASQL', <br>'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', <br>'select * from [aa.DBF]') <br>select * from 表 <br><br>说明: <br>SourceDB=c:\ 指定foxpro表所在的文件夹 <br>aa.DBF 指定foxpro表的文件名. <br><br><br><br>/*************导出到Access********************/ <br>insert into openrowset('Microsoft.Jet.OLEDB.4.0', <br>'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表 <br><br>/*************导入Access********************/ <br>insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', <br>'x:\A.mdb';'admin';'',A表) <br><br>文件名为参数 <br>declare @fname varchar(20) <br>set @fname = 'd:\test.mdb' <br>exec('SELECT a.* FROM opendatasource(''Microsoft.Jet.OLEDB.4.0'', <br>'''+@fname+''';''admin'';'''', topics) as a ') <br><br>SELECT * <br>FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', <br>'Data Source="f:\northwind.mdb";Jet OLEDB:Database Password=123;User ID=Admin;Password=;')...产品 <br><br>********************* 导入 xml　文件 <br><br>DECLARE @idoc int <br>DECLARE @doc varchar(1000) <br>--sample XML document <br>SET @doc =' <br>&lt;root&gt; <br>&lt;Customer cid= "C1" name="Janine" city="Issaquah"&gt; <br>&lt;Order oid="O1" date="1/20/1996" amount="3.5" /&gt; <br>&lt;Order oid="O2" date="4/30/1997" amount="13.4"&gt;Customer was very satisfied <br>&lt;/Order&gt; <br>&lt;/Customer&gt; <br>&lt;Customer cid="C2" name="Ursula" city="Oelde" &gt; <br>&lt;Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue <br>white red"&gt; <br>&lt;Urgency&gt;Important&lt;/Urgency&gt; <br>Happy Customer. <br>&lt;/Order&gt; <br>&lt;Order oid="O4" date="1/20/1996" amount="10000"/&gt; <br>&lt;/Customer&gt; <br>&lt;/root&gt; <br>' <br>-- Create an internal representation of the XML document. <br>EXEC sp_xml_preparedocument @idoc OUTPUT, @doc <br><br>-- Execute a SELECT statement using OPENXML rowset provider. <br>SELECT * <br>FROM OPENXML (@idoc, '/root/Customer/Order', 1) <br>WITH (oid char(5), <br>amount float, <br>comment ntext 'text()') <br>EXEC sp_xml_removedocument @idoc <br><br><br><br>??????? <br><br>/**********************Excel导到Txt****************************************/ <br>想用 <br>select * into opendatasource(...) from opendatasource(...) <br>实现将一个Excel文件内容导入到一个文本文件 <br><br>假设Excel中有两列，第一列为姓名，第二列为很行帐号(16位) <br>且银行帐号导出到文本文件后分两部分，前8位和后8位分开。 <br><br>邹健： <br>如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2 <br>然后就可以用下面的语句进行插入 <br>注意文件名和目录根据你的实际情况进行修改. <br><br>insert into <br>opendatasource('MICROSOFT.JET.OLEDB.4.0' <br>,'Text;HDR=Yes;DATABASE=C:\' <br>)...[aa#txt] <br>--,aa#txt) <br>--*/ <br>select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br>from <br>opendatasource('MICROSOFT.JET.OLEDB.4.0' <br>,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls' <br>--,Sheet1$) <br>)...[Sheet1$] <br><br><br><br>如果你想直接插入并生成文本文件,就要用bcp <br><br>declare @sql varchar(8000),@tbname varchar(50) <br><br>--首先将excel表内容导入到一个全局临时表 <br>select @tbname='[##temp'+cast(newid() as varchar(40))+']' <br>,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br>into '+@tbname+' from <br>opendatasource(''MICROSOFT.JET.OLEDB.4.0'' <br>,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'' <br>)...[Sheet1$]' <br>exec(@sql) <br><br>--然后用bcp从全局临时表导出到文本文件 <br>set @sql='bcp "'+@tbname+'" out "c:\aa.txt" /S"(local)" /P"" /c' <br>exec master..xp_cmdshell @sql <br><br>--删除临时表 <br>exec('drop table '+@tbname) <br><br>/********************导整个数据库*********************************************/ <br><br>用bcp实现的存储过程 <br><br>/* <br>实现数据导入/导出的存储过程 <br>根据不同的参数,可以实现导入/导出整个数据库/单个表 <br>调用示例: <br>--导出调用示例 <br>----导出单个表 <br>exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1 <br>----导出整个数据库 <br>exec file2table 'zj','','','xzkh_sa','C:\docman',1 <br><br>--导入调用示例 <br>----导入单个表 <br>exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0 <br>----导入整个数据库 <br>exec file2table 'zj','','','xzkh_sa','C:\docman',0 <br><br>*/ <br>if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1) <br>drop procedure File2Table <br>go <br>create procedure File2Table <br>@servername varchar(200) --服务器名 <br>,@username varchar(200) --用户名,如果用NT验证方式,则为空'' <br>,@password varchar(200) --密码 <br>,@tbname varchar(500) --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表 <br>,@filename varchar(1000) --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt <br>,@isout bit --1为导出,0为导入 <br>as <br>declare @sql varchar(8000) <br><br>if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表 <br>begin <br>set @sql='bcp '+@tbname <br>+case when @isout=1 then ' out ' else ' in ' end <br>+' "'+@filename+'" /w' <br>+' /S '+@servername <br>+case when isnull(@username,'')='' then '' else ' /U '+@username end <br>+' /P '+isnull(@password,'') <br>exec master..xp_cmdshell @sql <br>end <br>else <br>begin --导出整个数据库,定义游标,取出所有的用户表 <br>declare @m_tbname varchar(250) <br>if right(@filename,1)&lt;&gt;'\' set @filename=@filename+'\' <br><br>set @m_tbname='declare #tb cursor for select name from '+@tbname+'..sysobjects where xtype=''U''' <br>exec(@m_tbname) <br>open #tb <br>fetch next from #tb into @m_tbname <br>while @@fetch_status=0 <br>begin <br>set @sql='bcp '+@tbname+'..'+@m_tbname <br>+case when @isout=1 then ' out ' else ' in ' end <br>+' "'+@filename+@m_tbname+'.txt " /w' <br>+' /S '+@servername <br>+case when isnull(@username,'')='' then '' else ' /U '+@username end <br>+' /P '+isnull(@password,'') <br>exec master..xp_cmdshell @sql <br>fetch next from #tb into @m_tbname <br>end <br>close #tb <br>deallocate #tb <br>end <br>go <br><br>/************* Oracle **************/ <br>EXEC sp_addlinkedserver 'OracleSvr', <br>'Oracle 7.3', <br>'MSDAORA', <br>'ORCLDB' <br>GO <br><br>delete from openquery(mailser,'select * from yulin') <br><br>select * from openquery(mailser,'select * from yulin') <br><br>update openquery(mailser,'select * from yulin where id=15')set disorder=555,catago=888 <br><br>insert into openquery(mailser,'select disorder,catago from yulin')values(333,777) <br><br><br><br>补充： <br><br>对于用bcp导出,是没有字段名的. <br><br>用openrowset导出,需要事先建好表. <br><br>用openrowset导入,除ACCESS及EXCEL外,均不支持非本机数据导入 <br>删除</div>
<img src ="http://www.cppblog.com/elva/aggbug/37896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/elva/" target="_blank">叶子</a> 2007-12-06 11:19 <a href="http://www.cppblog.com/elva/archive/2007/12/06/37896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>