日期:2014-05-17  浏览次数:20431 次

关于SQL 交叉表的问题,郁闷好几天了。
表名:szmxb
表结构如下:
         bh      部门编号 部门名称  xm_No  xm_Name ic_Hzje
11 11001 内一科 S009 心电图 150
11 11006 内二科 S001 挂号费 152
12 12008 门诊灸疗科 S089 非药物治疗 496
12 12032 体检办 S020 化验费 1066
12 12032 体检办 S012 放射费 891
11 11003 外科 S078 救护车 470
11 11001 内一科 S006 彩超费 679
12 12027 门诊收费处 S106 预收住院单据 18
12 12032 体检办 S009 心电图 25
12 12032 体检办 S005 B超费 29

这个表是一个视图,是动态生成的,做为交叉表的数据来源,有700多行
生成交叉表的代码如下:

Declare @s Varchar(8000) Set @s='Select bh,部门编号,部门名称 ' 
Select @s=@s+',['+Xm_No+']=Sum(case Xm_No when '''+Xm_No+''' then IC_hzje else 0 end)'  
From szmxb   Group By Xm_No Order By Xm_No 
exec(@s+' From szmxb Group by 部门编号,部门名称,bh  Order By 部门编号 ')

在执行时,提示如下错误:

服务器: 消息 156,级别 15,状态 1,行 1
在关键字 'From' 附近有语法错误。


把该表的行删除一些,却又能执行,不知道是什么原因,还请大侠们指点一下。

数据库备份下载地址:
http://www.zdasoft.cn/update/aaaa.zip

------解决方案--------------------
varchar的最大长度是8000,而我们打印出来什么发现长度只到4048就没有了呢?

原来问题在你的数据设计里 XM_No nvarchar(50)
nvarchar是双字节,最大长度就是4048,因为字符中包含有nvarchar类型,所以只能按nvarchar的最大长度计算

解决你的问题就是把
XM_No nvarchar(50)
改为
XM_No varchar(50)