首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>数据库>SQL数据库>sql语句写行转列的代码遇到无法处理的问题解决方案
sql语句写行转列的代码遇到无法处理的问题解决方案
来源: 发布时间:2008-11-26 发布人: 浏览: 人次   字体: [ ]  

常有人提到,在写行转列的功能用动态生成SQL语句的方法处理数据时,处理语句超长,会出现无法处理的问题
下面就讨论这个问题:

/*--   数据测试环境   --*/
if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[tb] ')   and   OBJECTPROPERTY(id,   N 'IsUserTable ')   =   1)
drop   table   [tb]
GO

create   table   tb(单位名称   varchar(10),日期   datetime,销售额   int)
insert   into   tb
select   'A单位 ', '2001-01-01 ',100
union   all   select   'B单位 ', '2001-01-02 ',101
union   all   select   'C单位 ', '2001-01-03 ',102
union   all   select   'D单位 ', '2001-01-04 ',103
union   all   select   'E单位 ', '2001-01-05 ',104
union   all   select   'F单位 ', '2001-01-06 ',105
union   all   select   'G单位 ', '2001-01-07 ',106
union   all   select   'H单位 ', '2001-01-08 ',107
union   all   select   'I单位 ', '2001-01-09 ',108
union   all   select   'J单位 ', '2001-01-11 ',109

/*--   要求结果
日期               A单位     B单位   C单位   D单位   E单位     F单位   G单位   H单位   I单位   J单位      
----------   -----   -----   -----   -----   -----   -----   ----     ----     ----   ------
2001-01-01   100       0           0           0           0           0           0           0           0           0
2001-01-02   0           101       0           0           0           0           0           0           0           0
2001-01-03   0           0           102       0           0           0           0           0           0           0
2001-01-04   0           0           0           103       0           0           0           0           0           0
2001-01-05   0           0           0           0           104       0           0           0           0           0
2001-01-06   0           0           0           0           0           105       0           0           0           0
2001-01-07   0           0           0           0           0           0           106       0           0           0
2001-01-08   0           0           0           0           0           0           0           107       0           0
2001-01-09   0           0           0           0           0           0           0           0           108       0
2001-01-11   0           0           0           0           0           0           0           0           0           109
--*/

/*--   常规处理方法*/  
declare   @sql   varchar(8000)
set   @sql= 'select   日期=convert(varchar(10),日期,120) '
select   @sql=@sql+ ',[ '+单位名称
+ ']=sum(case   单位名称   when   ' ' '+单位名称+ ' ' '   then   销售额   else   0   end) '
from(select   distinct   单位名称   from   tb)   a
exec(@sql+ '   from   tb   group   by   convert(varchar(10),日期,120) ')


/*--   问题:   如果单位很多,这时,@SQL的值就会被截断,从而出错.*/

/*--下面给出三种解决办法:--*/

--/*--   方法1.   多个变量处理

--定义变量,估计需要多少个变量才能保存完所有数据
declare   @sql0   varchar(8000),@sql1   varchar(8000)
--,...@sqln   varchar(8000)

--生成数据处理临时表
select   id=identity(int,0,1),groupid=0
,值= ',[ '+单位名称   + ']=sum(case   单位名称   when   ' ' '
+单位名称+ ' ' '   then   销售额   else   0   end) '
into   #temp   from(select   distinct   单位名称   from   tb)   a

--分组临时表,判断慨最多多少个单位可以组合成一个不超过8000的字符串,这里取假设为5个
update   #temp   set   groupid=id/5     --5为每组的单位个数

--生成SQL语句处理字符串
    --初始化
select   @sql0= ' '
,@sql1= ' '
--   ...
--   ,@sqln

    --得到处理字符串
select   @sql0=@sql0+值   from   #temp   where   groupid=0     --第一个变量
select   @sql1=@sql1+值   from   #temp   where   groupid=1     --第二个变量
--select   @sqln=@sqln+值   from   #temp   where   groupid=n     --第n个变量

--查询
exec( 'select   日期=convert(varchar(10),日期,120) '
+@sql0+@sql1
--   ...+@sqln
+ '   from   tb   group   by   convert(varchar(10),日期,120)
')

--删除临时表
drop   table   #temp

/*
优点:比较灵活,数据量大时只需要增加变量就行了.不用改动其他部分
缺点:要自行估计处理的数据,估计不足就会出错
*/
--*/


--/*--方法2.   bcp+isql

--因为要用到bcp+isql,所以需要这些信息
declare   @servername   varchar(250),@username   varchar(250),@pwd   varchar(250)
select   @servername= 'zj '     --服务器名
,@username= ' '         --用户名
,@pwd= ' '           --密码

declare   @tbname   varchar(50),@sql   varchar(8000)

--创建数据处理临时表
set   @tbname= '[##temp_ '+convert(varchar(40),newid())+ '] '
set   @sql= 'create   table   '+@tbname+ '(值   varchar(8000))
insert   into   '+@tbname+ '   values( ' 'create   view   '
+stuff(@tbname,2,2, ' ')+ '   as  
select   日期=convert(varchar(10),日期,120) ' ') '
exec(@sql)

set   @sql= 'insert   into   '+@tbname+ '
select   ' ',[ ' '+单位名称+ ' ']=sum(case   单位名称   when   ' ' ' ' ' '
+单位名称+ ' ' ' ' ' '   then   销售额   else   0   end) ' '
from(select   distinct   单位名称   from   tb)   a '
exec(@sql)

set   @sql= 'insert   into   '+@tbname+ '  
values( ' 'from   tb   group   by   convert(varchar(10),日期,120) ' ') '
exec(@sql)

--生成创建视图的文件,注意使用了文件:c:\temp.txt
set   @sql= 'bcp   " '+@tbname+ ' "   out   "c:\temp.txt "   /S " '
+@servername+ ' "   /U " '+@username+ ' "   /P " '+@pwd+ ' "   /c '
exec   master..xp_cmdshell   @sql

--删除临时表
set   @sql= 'drop   table   '+@tbname
exec(@sql)

--调用isql生成数据处理视图
set   @tbname=stuff(@tbname,2,2, ' ')
set   @sql= 'isql   /S " '+@servername
+case   @username   when   ' '   then   ' "   /E '   else   ' "   /U " '+@username+ ' "   /P " '+@pwd+ ' " '   end
+ '   /d " '+db_name()+ ' "   /i "c:\temp.txt " '

exec   master..xp_cmdshell   @sql

--调用视图,显示处理结果
set   @sql= 'select   *   from   '+@tbname+ '
drop   view   '+@tbname
exec(@sql)

/*
优点:程序自动处理,不存在判断错误的问题
缺点:复杂,经过的步骤多,容易出错,而且需要一定的操作员权限
*/
--*/


共2页: 上一页 1 [2] 下一页
相 关 文 章   发布商链接
·浅谈sql2008新增的四个有关日期时间...
·在win2003安装Sql2005提示登录失败的...
·sql获取字符串中的字母和数字函数
·sql2005数据库被置疑后的解决方案
·SQL查询条件中有转义符的解决办法
·分析sql2005数据库中二进制数据的存...
·SQL数据库实现拆分字符串的三种方法
·sql2005实现获取第n行数据的代码
·另类利用Sql语句随机提取数据,可提...
·SQL2008数据库安装心得总结
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·SQL数据库实现用SQL语句根据...
·SqlServer 2005 Express的配...
·sql排序规则的简介及其修改操
·如何用sql语句为字段添加和去
·sqlserver数据库日志文件压缩
·sql语句获得数据库某表字段的
·ISNUMERIC函数介绍及其要注意
·SQLServer2005导入xml文件实...
·SQL Server2005中删除表中重...
·如何手工启动SQLServer的全文
·sql删除数据库中的所有表语句
·SqlServr利用触发器来控制某...
·SQLServer常用日期格式转换方
·用sql实现查询重复记录的代码
·SQLServer2005分解导入xml文...
热 门 文 章
·图解SQL2008安装向导的使用
·实现Excel数据导入到SQL2005...
·SQLServer常用日期格式转换方...
·MS sql安装时“无法在COM+目...
·sql语句联合删除多个表技巧
·sql删除数据库中的所有表语句
·Sql Server端口连接的问题
·如何在SQL Server中得到自动...
·sql排序规则的简介及其修改操...
·SQL Server2005中删除表中重...
·分析SQL2005最新高效分页方法
·小解sqlServer中临时表及表变...
·用sql实现查询重复记录的代码
·MS SQL2005无法远程连接问题...
·如何修改sqlserver数据库名称
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .