精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:
今天做个行列转换 找到的好语句 解决了我的问题
None.gif * 说明:复制表(只复制结构,源表名:a 新表名:b)
None.gif select * into b from a where 1 <> 1
None.gif
None.gif * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
None.gif insert into b(a, b, c) select d,e,f from b;
None.gif
None.gif * 说明:显示文章、提交人和最后回复时间
None.gif select a.title,a.username,b.adddate from table a,( select max(adddate) adddate from table where table.title =a.title) b
None.gif
None.gif * 说明:外连接查询(表名1:a 表名2:b)
None.gif select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
None.gif
None.gif * 说明:日程安排提前五分钟提醒
None.gif select * from 日程安排 where datediff( ' minute ',f开始时间, getdate()) > 5
None.gif
None.gif * 说明:两张关联表,删除主表中已经在副表中没有的信息
None.gif delete from info where not exists ( select * from infobz where info.infid =infobz.infid )
None.gif
None.gif * 说明: --
None.gif

None.gif SQL:
None.gif
None.gif SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE
None.gif
None.gif FROM TABLE1,
None.gif
None.gif ( SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE
None.gif
None.gif FROM ( SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND
None.gif
None.gif FROM TABLE2
None.gif
None.gif WHERE TO_CHAR(UPD_DATE, ' YYYY/MM ') = TO_CHAR(SYSDATE, ' YYYY/MM ')) X,
None.gif
None.gif ( SELECT NUM, UPD_DATE, STOCK_ONHAND
None.gif
None.gif FROM TABLE2
None.gif
None.gif WHERE TO_CHAR(UPD_DATE, ' YYYY/MM ') =
None.gif
None.gif TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, ' YYYY/MM ') || ' /01 ', ' YYYY/MM/DD ') - 1, ' YYYY/MM ') ) Y,
None.gif
None.gif WHERE X.NUM = Y.NUM ( +
None.gif
None.gif AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND, 0) <> X.STOCK_ONHAND ) B
None.gif
None.gif WHERE A.NUM = B.NUM
None.gif
None.gif * 说明: --
None.gif
select * from studentinfo where not exists( select * from student where studentinfo.id =student.id) and 系名称 = ' "&strdepartmentname&" ' and 专业名称 = ' "&strprofessionname&" ' order by 性别,生源地,高考总成绩
None.gif
None.gif * 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)
None.gif
None.gif SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, ' yyyy ') AS telyear,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 01 ', a.factration)) AS JAN,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 02 ', a.factration)) AS FRI,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 03 ', a.factration)) AS MAR,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 04 ', a.factration)) AS APR,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 05 ', a.factration)) AS MAY,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 06 ', a.factration)) AS JUE,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 07 ', a.factration)) AS JUL,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 08 ', a.factration)) AS AGU,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 09 ', a.factration)) AS SEP,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 10 ', a.factration)) AS OCT,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 11 ', a.factration)) AS NOV,
None.gif
None.gif SUM(decode(TO_CHAR(a.telfeedate, ' mm '), ' 12 ', a.factration)) AS DEC
None.gif
None.gif FROM ( SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration
None.gif
None.gif FROM TELFEESTAND a, TELFEE b
None.gif
None.gif WHERE a.tel = b.telfax) a
None.gif
None.gif GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, ' yyyy ')
None.gif
None.gif * 说明:四表联查问题
None.gif 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 dot.gif..
None.gif
None.gif * 说明:得到表中最小的未使用的ID号
None.gif
None.gif * SELECT ( CASE WHEN EXISTS( SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN ( SELECT a.HandleID - 1 FROM Handle a)
None.gif
None.gif * 一个SQL语句的问题:行列转换
None.gif select * from v_temp
None.gif 上面的视图结果如下:
None.gif user_name role_name
None.gif -- -----------------------
None.gif
系统管理员 管理员
None.gif feng 管理员
None.gif feng 一般用户
None.gif test 一般用户
None.gif 想把结果变成这样:
None.gif user_name role_name
None.gif -- -------------------------
None.gif
系统管理员 管理员
None.gif feng 管理员,一般用户
None.gif test 一般用户
None.gif ===================
None.gif create table a_test(name varchar( 20),role2 varchar( 20))
None.gif insert into a_test values( ' ', ' 管理员 ')
None.gif insert into a_test values( ' ', ' 管理员 ')
None.gif insert into a_test values( ' ', ' 一般用户 ')
None.gif insert into a_test values( ' ', ' 一般用户 ')
None.gif
None.gif create function join_str( @content varchar( 100))
None.gif returns varchar( 2000)
None.gif as
None.gif begin
None.gif declare @str varchar( 2000)
None.gif set @str = ''
None.gif select @str = @str + ' , ' + rtrim(role2) from a_test where [ name ] = @content
None.gif select @str = right( @str, len( @str) - 1)
None.gif return @str
None.gif end
None.gif go
None.gif
None.gif -- 调用:
None.gif
select [ name ],dbo.join_str( [ name ]) role2 from a_test group by [ name ]
None.gif
None.gif -- select distinct name,dbo.uf_test(name) from a_test
None.gif

None.gif * 快速比较结构相同的两表
None.gif 结构相同的两表,一表有记录3万条左右,一表有记录2万条左右,我怎样快速查找两表的不同记录?
None.gif ============================
None.gif 给你一个测试方法,从northwind中的orders表取数据。
None.gif select * into n1 from orders
None.gif select * into n2 from orders
None.gif
None.gif select * from n1
None.gif select * from n2
None.gif
None.gif -- 添加主键,然后修改n1中若干字段的若干条
None.gif
alter table n1 add constraint pk_n1_id primary key (OrderID)
None.gif alter table n2 add constraint pk_n2_id primary key (OrderID)
None.gif
None.gif select OrderID from ( select * from n1 union select * from n2) a group by OrderID having count( *) > 1
None.gif
None.gif 应该可以,而且将不同的记录的ID显示出来。
None.gif 下面的适用于双方记录一样的情况,
None.gif
None.gif select * from n1 where orderid in ( select OrderID from ( select * from n1 union select * from n2) a group by OrderID having count( *) > 1)
None.gif 至于双方互不存在的记录是比较好处理的
None.gif -- 删除n1,n2中若干条记录
None.gif
delete from n1 where orderID in ( ' 10728 ', ' 10730 ')
None.gif delete from n2 where orderID in ( ' 11000 ', ' 11001 ')
None.gif
None.gif -- *************************************************************
None.gif
-- 双方都有该记录却不完全相同
None.gif
select * from n1 where orderid in( select OrderID from ( select * from n1 union select * from n2) a group by OrderID having count( *) > 1)
None.gif union
None.gif -- n2中存在但在n1中不存的在10728,10730
None.gif
select * from n1 where OrderID not in ( select OrderID from n2)
None.gif union
None.gif -- n1中存在但在n2中不存的在11000,11001
None.gif
select * from n2 where OrderID not in ( select OrderID from n1)
None.gif
None.gif * 四种方法取表里n到m条纪录:
None.gif
None.gif 1.
None.gif select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入
None.gif
set rowcount n
None.gif select * from 表变量 order by columnname desc
None.gif
None.gif
None.gif 2.
None.gif select top n * from ( select top m * from tablename order by columnname) a order by columnname desc
None.gif
None.gif
None.gif 3.如果tablename里没有其他identity列,那么:
None.gif select identity( int) id0, * into # temp from tablename
None.gif
None.gif 取n到m条的语句为:
None.gif select * from # temp where id0 >=n and id0 <= m
None.gif
None.gif 如果你在执行select identity( int) id0, * into # temp from tablename这条语句的时候报错,那是因为你的DB中间的select into /bulkcopy属性没有打开要先执行:
None.gif exec sp_dboption 你的DB名字, ' select into/bulkcopy ',true
None.gif
None.gif
None.gif 4.如果表里有identity属性,那么简单:
None.gif select * from tablename where identitycol between n and m
None.gif
None.gif * 如何删除一个表中重复的记录?
None.gif create table a_dist(id int,name varchar( 20))
None.gif
None.gif insert into a_dist values( 1, ' abc ')
None.gif insert into a_dist values( 1, ' abc ')
None.gif insert into a_dist values( 1, ' abc ')
None.gif insert into a_dist values( 1, ' abc ')
None.gif
None.gif exec up_distinct ' a_dist ', ' id '
None.gif
None.gif select * from a_dist
None.gif
None.gif create procedure up_distinct( @t_name varchar( 30), @f_key varchar( 30))
None.gif -- f_key表示是分组字段﹐即主键字段
None.gif
as
None.gif begin
None.gif declare @max integer, @id varchar( 30) , @sql varchar( 7999) , @type integer
None.gif select @sql = ' declare cur_rows cursor for select ' + @f_key + ' ,count(*) from ' + @t_name + ' group by ' + @f_key + ' having count(*) > 1 '
None.gif exec( @sql)
None.gif open cur_rows
None.gif fetch cur_rows into @id, @max
None.gif while @@fetch_status = 0
None.gif begin
None.gif select @max = @max - 1
None.gif set rowcount @max
None.gif select @type = xtype from syscolumns where id = object_id( @t_name) and name = @f_key
None.gif if @type = 56
None.gif select @sql = ' delete from ' + @t_name + ' where ' + @f_key + ' = ' + @id
None.gif if @type = 167
None.gif select @sql = ' delete from ' + @t_name + ' where ' + @f_key + ' = ' + '''' + @id + ''''
None.gif exec( @sql)
None.gif fetch cur_rows into @id, @max
None.gif end
None.gif close cur_rows
None.gif deallocate cur_rows
None.gif set rowcount 0
None.gif end
None.gif
None.gif select * from systypes
None.gif select * from syscolumns where id = object_id( ' a_dist ')
None.gif
None.gif * 查询数据的最大排序问题(只能用一条语句写)
None.gif CREATE TABLE hard (qu char ( 11) ,co char ( 11) ,je numeric( 3, 0))
None.gif
None.gif insert into hard values ( ' A ', ' 1 ', 3)
None.gif insert into hard values ( ' A ', ' 2 ', 4)
None.gif insert into hard values ( ' A ', ' 4 ', 2)
None.gif insert into hard values ( ' A ', ' 6 ', 9)
None.gif insert into hard values ( ' B ', ' 1 ', 4)
None.gif insert into hard values ( ' B ', ' 2 ', 5)
None.gif insert into hard values ( ' B ', ' 3 ', 6)
None.gif insert into hard values ( ' C ', ' 3 ', 4)
None.gif insert into hard values ( ' C ', ' 6 ', 7)
None.gif insert into hard values ( ' C ', ' 2 ', 3)
None.gif
None.gif
None.gif 要求查询出来的结果如下:
None.gif
None.gif qu co je
None.gif -- --------- ----------- -----
None.gif
A 6 9
None.gif A 2 4
None.gif B 3 6
None.gif B 2 5
None.gif C 6 7
None.gif C 3 4
None.gif
None.gif
None.gif 就是要按qu分组,每组中取je最大的前2位!!
None.gif 而且只能用一句sql语句!!!
None.gif select * from hard a where je in ( select top 2 je from hard b where a.qu =b.qu order by je)
None.gif
None.gif * 求删除重复记录的sql语句?
None.gif 怎样把具有相同字段的纪录删除,只留下一条。
None.gif 例如,表test里有id,name字段
None.gif 如果有name相同的记录 只留下一条,其余的删除。
None.gif name的内容不定,相同的记录数不定。
None.gif 有没有这样的sql语句?
None.gif ==============================
None.gif A:一个完整的解决方案:
None.gif
None.gif 将重复的记录记入temp1表:
None.gif select [ 标志字段id ], count( *) into temp1 from [ 表名 ]
None.gif group by [ 标志字段id ]
None.gif having count( *) > 1
None.gif
None.gif 2、将不重复的记录记入temp1表:
None.gif insert temp1 select [ 标志字段id ], count( *) from [ 表名 ] group by [ 标志字段id ] having count( *) = 1
None.gif
None.gif 3、作一个包含所有不重复记录的表:
None.gif select * into temp2 from [ 表名 ] where 标志字段id in( select 标志字段id from temp1)
None.gif
None.gif 4、删除重复表:
None.gif delete [ 表名 ]
None.gif
None.gif 5、恢复表:
None.gif insert [ 表名 ] select * from temp2
None.gif
None.gif 6、删除临时表:
None.gif drop table temp1
None.gif drop table temp2
None.gif ================================
None.gif B:
None.gif create table a_dist(id int,name varchar( 20))
None.gif
None.gif insert into a_dist values( 1, ' abc ')
None.gif insert into a_dist values( 1, ' abc ')
None.gif insert into a_dist values( 1, ' abc ')
None.gif insert into a_dist values( 1, ' abc ')
None.gif
None.gif exec up_distinct ' a_dist ', ' id '
None.gif
None.gif select * from a_dist
None.gif
None.gif create procedure up_distinct( @t_name varchar( 30), @f_key varchar( 30))
None.gif -- f_key表示是分组字段﹐即主键字段
None.gif
as
None.gif begin
None.gif declare @max integer, @id varchar( 30) , @sql varchar( 7999) , @type integer
None.gif select @sql = ' declare cur_rows cursor for select ' + @f_key + ' ,count(*) from ' + @t_name + ' group by ' + @f_key + ' having count(*) > 1 '
None.gif exec( @sql)
None.gif open cur_rows
None.gif fetch cur_rows into @id, @max
None.gif while @@fetch_status = 0
None.gif begin
None.gif select @max = @max - 1
None.gif set rowcount @max
None.gif select @type = xtype from syscolumns where id = object_id( @t_name) and name = @f_key
None.gif if @type = 56
None.gif select @sql = ' delete from ' + @t_name + ' where ' + @f_key + ' = ' + @id
None.gif if @type = 167
None.gif select @sql = ' delete from ' + @t_name + ' where ' + @f_key + ' = ' + '''' + @id + ''''
None.gif exec( @sql)
None.gif fetch cur_rows into @id, @max
None.gif end
None.gif close cur_rows
None.gif deallocate cur_rows
None.gif set rowcount 0
None.gif end
None.gif
None.gif select * from systypes
None.gif select * from syscolumns where id = object_id( ' a_dist ')
None.gif
None.gif * 行列转换 -- 普通
None.gif

None.gif 假设有张学生成绩表(CJ)如下
None.gif Name Subject Result
None.gif 张三 语文 80
None.gif 张三 数学 90
None.gif 张三 物理 85
None.gif 李四 语文 85
None.gif 李四 数学 92
None.gif 李四 物理 82
None.gif
None.gif 想变成
None.gif 姓名 语文 数学 物理
None.gif 张三 80 90 85
None.gif 李四 85 92 82
None.gif
None.gif declare @sql varchar( 4000)
None.gif set @sql = ' select Name '
None.gif select @sql = @sql + ' ,sum(case Subject when ''' +Subject + ''' then Result end) [ ' +Subject + ' ] '
None.gif from ( select distinct Subject from CJ) as a
None.gif select @sql = @sql + ' from test group by name '
None.gif exec( @sql)
None.gif
None.gif 行列转换 -- 合并
None.gif

None.gif 有表A,
None.gif id pid
None.gif 1 1
None.gif 1 2
None.gif 1 3
None.gif 2 1
None.gif 2 2
None.gif 3 1
None.gif 如何化成表B:
None.gif id pid
None.gif 1 1, 2, 3
None.gif 2 1, 2
None.gif 3 1
None.gif
None.gif 创建一个合并的函数
None.gif create function fmerg( @id int)
None.gif returns varchar( 8000)
None.gif as
None.gif begin
None.gif declare @str varchar( 8000)
None.gif set @str = ''
None.gif select @str = @str + ' , ' + cast(pid as varchar) from 表A where id = @id
None.gif set @str = right( @str, len( @str) - 1)
None.gif return( @str)
None.gif End
None.gif go
None.gif
None.gif -- 调用自定义函数得到结果
None.gif
select distinct id,dbo.fmerg(id) from 表A
None.gif
None.gif * 如何取得一个数据表的所有列名
None.gif
None.gif 方法如下:先从SYSTEMOBJECT系统表中取得数据表的SYSTEMID,然后再SYSCOLUMN表中取得该数据表的所有列名。
None.gif SQL语句如下:
None.gif declare @objid int, @objname char( 40)
None.gif set @objname = ' tablename '
None.gif select @objid = id from sysobjects where id = object_id( @objname)
None.gif select ' Column_name ' = name from syscolumns where id = @objid order by colid
None.gif
None.gif
None.gif
None.gif SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ' users '
None.gif
None.gif * 通过SQL语句来更改用户的密码
None.gif
None.gif 修改别人的,需要sysadmin role
None.gif EXEC sp_password NULL, ' newpassword ', ' User '
None.gif
None.gif 如果帐号为SA执行EXEC sp_password NULL, ' newpassword ', sa
None.gif
None.gif * 怎么判断出一个表的哪些字段不允许为空?
None.gif
None.gif select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where IS_NULLABLE = ' NO ' and TABLE_NAME =tablename
None.gif
None.gif * 如何在数据库里找到含有相同字段的表?
None.gif a. 查已知列名的情况
None.gif SELECT b.name as TableName,a.name as columnname
None.gif From syscolumns a INNER JOIN sysobjects b
None.gif ON a.id =b.id
None.gif AND b.type = ' U '
None.gif AND a.name = ' 你的字段名字 '
None.gif
None.gif * 未知列名查所有在不同表出现过的列名
None.gif Select o.name As tablename,s1.name As columnname
None.gif From syscolumns s1, sysobjects o
None.gif Where s1.id = o.id
None.gif And o.type = ' U '
None.gif And Exists (
None.gif Select 1 From syscolumns s2
None.gif Where s1.name = s2.name
None.gif And s1.id <> s2.id
None.gif )
None.gif
None.gif * 查询第xxx行数据
None.gif
None.gif 假设id是主键:
None.gif 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)
None.gif
None.gif 如果使用游标也是可以的
None.gif fetch absolute [ number ] from [ cursor_name ]
None.gif 行数为绝对行数
None.gif
None.gif * SQL Server日期计算
None.gif a. 一个月的第一天
None.gif SELECT DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0)
None.gif b. 本周的星期一
None.gif SELECT DATEADD(wk, DATEDIFF(wk, 0, getdate()), 0)
None.gif c. 一年的第一天
None.gif SELECT DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0)
None.gif d. 季度的第一天
None.gif SELECT DATEADD(qq, DATEDIFF(qq, 0, getdate()), 0)
None.gif e. 上个月的最后一天
None.gif SELECT dateadd(ms, - 3, DATEADD(mm, DATEDIFF(mm, 0, getdate()), 0))
None.gif f. 去年的最后一天
None.gif SELECT dateadd(ms, - 3, DATEADD(yy, DATEDIFF(yy, 0, getdate()), 0))
None.gif g. 本月的最后一天
None.gif SELECT dateadd(ms, - 3, DATEADD(mm, DATEDIFF(m, 0, getdate()) + 1, 0))
None.gif h. 本月的第一个星期一
None.gif select DATEADD(wk, DATEDIFF(wk, 0,
None.gif dateadd(dd, 6 - datepart( day, getdate()), getdate())
None.gif ), 0)
None.gif i. 本年的最后一天
None.gif SELECT dateadd(ms, - 3, DATEADD(yy, DATEDIFF(yy, 0, getdate()) + 1, 0))。
None.gif
None.gif * 获取表结构 [ 把 'sysobjects' 替换 成 'tablename' 即可 ]
None.gif
None.gif SELECT CASE IsNull(I.name, '')
None.gif When '' Then ''
None.gif Else ' * '
None.gif End as IsPK,
None.gif Object_Name(A.id) as t_name,
None.gif A.name as c_name,
None.gif IsNull( SubString(M. text, 1, 254), '') as pbc_init,
None.gif T.name as F_DataType,
None.gif CASE IsNull( TYPEPROPERTY(T.name, ' Scale '), '')
None.gif WHEN '' Then Cast(A.prec as varchar)
None.gif ELSE Cast(A.prec as varchar) + ' , ' + Cast(A.scale as varchar)
None.gif END as F_Scale,
None.gif A.isnullable as F_isNullAble
None.gif FROM Syscolumns as A
None.gif JOIN Systypes as T
None.gif ON (A.xType = T.xUserType AND A.Id = Object_id( ' sysobjects ') )
None.gif LEFT JOIN ( SysIndexes as I
None.gif JOIN Syscolumns as A1
None.gif ON ( I.id = A1.id and A1.id = object_id( ' sysobjects ') and (I.status & 0x800) = 0x800 AND A1.colid <= I.keycnt) )
None.gif ON ( A.id = I.id AND A.name = index_col( ' sysobjects ', I.indid, A1.colid) )
None.gif LEFT JOIN SysComments as M
None.gif ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, ' IsConstraint ') = 1 )
None.gif ORDER BY A.Colid ASC
None.gif
None.gif * 提取数据库内所有表的字段详细说明的SQL语句
None.gif
None.gif SELECT
None.gif ( case when a.colorder = 1 then d.name else '' end) N ' 表名 ',
None.gif a.colorder N ' 字段序号 ',
None.gif a.name N ' 字段名 ',
None.gif ( case when COLUMNPROPERTY( a.id,a.name, ' IsIdentity ') = 1 then ' ' else ''
None.gif end) N ' 标识 ',
None.gif ( case when ( SELECT count( *)
None.gif FROM sysobjects
None.gif WHERE (name in
None.gif ( SELECT name
None.gif FROM sysindexes
None.gif WHERE (id = a.id) AND (indid in
None.gif ( SELECT indid
None.gif FROM sysindexkeys
None.gif WHERE (id = a.id) AND (colid in
None.gif ( SELECT colid
None.gif FROM syscolumns
None.gif WHERE (id = a.id) AND (name = a.name))))))) AND
None.gif (xtype = ' PK ')) > 0 then ' ' else '' end) N ' 主键 ',
None.gif b.name N ' 类型 ',
None.gif a.length N ' 占用字节数 ',
None.gif COLUMNPROPERTY(a.id,a.name, ' PRECISION ') as N ' 长度 ',
None.gif isnull( COLUMNPROPERTY(a.id,a.name, ' Scale '), 0) as N ' 小数位数 ',
None.gif ( case when a.isnullable = 1 then ' ' else '' end) N ' 允许空 ',
None.gif isnull(e. text, '') N ' 默认值 ',
None.gif isnull(g. [ value ], '') AS N ' 字段说明 '
None.gif FROM syscolumns a
None.gif left join systypes b
None.gif on a.xtype =b.xusertype
None.gif inner join sysobjects d
None.gif on a.id =d.id and d.xtype = ' U ' and d.name <> ' dtproperties '
None.gif left join syscomments e
None.gif on a.cdefault =e.id
None.gif left join sysproperties g
None.gif on a.id =g.id AND a.colid = g.smallid
None.gif order by object_name(a.id),a.colorder
None.gif
None.gif * 快速获取表test的记录总数 [ 对大容量表非常有效 ]
None.gif
None.gif 快速获取表test的记录总数:
None.gif select rows from sysindexes where id = object_id( ' test ') and indid in ( 0, 1)
None.gif
None.gif update 2 set KHXH =(ID + 1)\ 2 2行递增编号
None.gif update [ 23 ] set id1 = ' No. ' + right( ' 00000000 ' +id, 6) where id not like ' No% ' //递增
None.gif update [ 23 ] set id1 = ' No. ' + right( ' 00000000 ' + replace(id1, ' No. ', ''), 6) //补位递增
None.gif delete from [ 1 ] where (id % 2) = 1
None.gif 奇数
None.gif
None.gif * 替换表名字段
None.gif update [ 1 ] set domurl = replace(domurl, ' Upload/Imgswf/ ', ' Upload/Photo/ ') where domurl like ' %Upload/Imgswf/% '
None.gif
None.gif * 截位
None.gif SELECT LEFT(表名, 5)
None.gif
None.gif熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact -SQL语句进行导入导出操作。在 Transact -SQL语句中,我们主要使用OpenDataSource函数、 OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL SERVER、ACCESS、EXCEL数据转换,详细说明如下:
None.gif
None.gif一、SQL SERVER 和ACCESS的数据导入导出
None.gif
None.gif常规的数据导入导出:
None.gif使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:
None.gif  ○1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation
None.gif  ○2Services(数据转换服务),然后选择 czdImport Data(导入数据)。
None.gif  ○3在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。
None.gif  ○4在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。
None.gif  ○5在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。
None.gif ○6在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。
None.gif
None.gifTransact -SQL语句进行导入导出:
None.gif 1.在SQL SERVER里查询access数据:
None.gif
None.gif SELECT * FROM OpenDataSource( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\DB.mdb";User ID=Admin;Password= ') dot.gif表名
None.gif
None.gif 2.将access导入SQL server
None.gif在SQL SERVER 里运行:
None.gif SELECT * INTO newtable FROM OPENDATASOURCE ( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\DB.mdb";User ID=Admin;Password= ' ) dot.gif表名
None.gif
None.gif 3.将SQL SERVER表里的数据插入到Access表中
None.gif在SQL SERVER 里运行:
None.gif insert into OpenDataSource( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source=" c:\DB.mdb";User ID=Admin;Password= ') dot.gif表名 (列名1,列名2) select 列名1,列名2 from sql表
None.gif
None.gif实例:
None.gif insert into OPENROWSET( ' Microsoft.Jet.OLEDB.4.0 ', ' C:\db.mdb '; ' admin '; '', Test) select id,name from Test
None.gif
None.gif
None.gif INSERT INTO OPENROWSET( ' Microsoft.Jet.OLEDB.4.0 ', ' c:\trade.mdb '; ' admin '; '', 表名) SELECT * FROM sqltablename
None.gif
None.gif二、SQL SERVER 和EXCEL的数据导入导出
None.gif
None.gif 1、在SQL SERVER里查询Excel数据:
None.gif
None.gif SELECT * FROM OpenDataSource( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0 ') dot.gif [ Sheet1$ ]
None.gif
None.gif下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。
None.gif SELECT * FROM OpenDataSource ( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0 ') dot.gifxactions
None.gif
None.gif 2、将Excel的数据导入SQL server :
None.gif SELECT * into newtable FROM OpenDataSource( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0 ') dot.gif [ Sheet1$ ]
None.gif
None.gif实例:
None.gif SELECT * into newtable FROM OpenDataSource( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0 ') dot.gifxactions
None.gif
None.gif 3、将SQL SERVER中查询到的数据导成一个Excel文件
None.gifT -SQL代码:
None.gif EXEC master..xp_cmdshell ' bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P"" '
None.gif参数:S 是SQL服务器名;U是用户;P是密码
None.gif说明:还可以导出文本文件等多种格式
None.gif
None.gif实例: EXEC master..xp_cmdshell ' bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa" '
None.gif
None.gif EXEC master..xp_cmdshell ' bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword '
None.gif
None.gif在VB6中应用ADO导出EXCEL文件代码:
None.gifDim cn As New ADODB.Connection
None.gifcn. open "Driver ={SQL Server};Server =WEBSVR; DataBase =WebMis;UID =sa;WD = 123;"
None.gifcn. execute "master..xp_cmdshell ' bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword '"
None.gif
None.gif
None.gif 4、在SQL SERVER里往Excel插入数据:
None.gif
None.gif insert into OpenDataSource( ' Microsoft.Jet.OLEDB.4.0 ', ' Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0 ') dot.giftable1 (A1,A2,A3) values ( 1, 2, 3)
None.gif
None.gifT -SQL代码:
None.gif INSERT INTO
None.gif OPENDATASOURCE( ' Microsoft.JET.OLEDB.4.0 ', ' Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls ') dot.gif [ Filiale1$ ] (bestand, produkt) VALUES ( 20, ' Test ')
None.gif
None.gif总结:利用以上语句,我们可以方便地将SQL SERVER、ACCESS和EXCEL电子表格软件中的数据进行转换,为我们提供了极大方便!



本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2006/10/28/542831.html,如需转载请自行联系原作者
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
16天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
16天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
3天前
|
SQL 数据管理 关系型数据库
如何在 Windows 上安装 SQL Server,保姆级教程来了!
在Windows上安装SQL Server的详细步骤包括:从官方下载安装程序(如Developer版),选择自定义安装,指定安装位置(非C盘),接受许可条款,选中Microsoft更新,忽略警告,取消“适用于SQL Server的Azure”选项,仅勾选必要功能(不包括Analysis Services)并更改实例目录至非C盘,选择默认实例和Windows身份验证模式,添加当前用户,最后点击安装并等待完成。安装成功后关闭窗口。后续文章将介绍SSMS的安装。
7 0
|
9天前
|
easyexcel 数据库
公司大佬对excel导入、导出的封装,那叫一个秒啊
封装公司统一使用的组件的主要目标是为了简化开发人员的调用流程,避免各个项目组重复集成和编写不规范的代码。文中提到对阿里EasyExcel进行了二次封装,提供了导入和导出功能,并支持模板的导入和导出。此外,还处理了读取数据与实际保存数据不一致的情况,通过提供自定义转换器来解决。
32 0
|
9天前
|
数据库
开发指南009-从list导出excel文件
从数据库返回一般是对象的列表,平台底层提供了从list转为excel文件的方法
|
9天前
|
前端开发
开发指南007-导出Excel
平台上开发导出Excel比过去的单体架构要复杂些,因为前端和后台不在一个进程空间里。
|
12天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
27 0
|
17天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
20天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
21 1
|
20天前
|
SQL 安全 Java
SQL server 2017安装教程
SQL server 2017安装教程
17 1