行列转换的问题?

TimLeaf 2010-03-09 05:46:45
SQL2000下,写了一个动态的SQL行列转换的语句,执行时出现以下错误。
Msg 8621, Level 17, State 89, Line 2
Internal Query Processor Error: The query processor ran out of stack
space during query optimization.

开始怀疑是字符串超长导致的,但是PRINT DATALENGTH(@strSql)的结果是:5373,并没有超过8000。
后来就逐个部分排除,删除了部分case when之后就可以正常显示结果了。
case when的行列转换还有最大数限制吗?

急求人解答...
...全文
130 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
SQL77 2010-03-10
  • 打赏
  • 举报
回复
SQL Server 的每个数据库最多可存储 20 亿个表,每个表可以有 1024 列。表的行数及总大小仅受可用存储空间的限制。每行最多可以存储 8,060 字节。如果创建具有 varchar、nvarchar 或 varbinary 列的表,并且列的字节总数超过 8,060 字节,虽然仍可以创建此表,但会出现警告信息。如果试图插入超过 8,060 字节的行或对行进行更新以至字节总数超过 8,060,将出现错误信息并且语句执行失败。



照理说没问题,不可能有这么多列吧,
TimLeaf 2010-03-10
  • 打赏
  • 举报
回复
贴了代码之后...就无人回答了...
TimLeaf 2010-03-10
  • 打赏
  • 举报
回复
引用 14 楼 sql_db 的回复:
恭喜,接分

放心,我一般不散分...
TimLeaf 2010-03-10
  • 打赏
  • 举报
回复
引用 13 楼 fredrickhu 的回复:
莫非是临时表优化了你的语句?

有点冷...
sql_db 2010-03-10
  • 打赏
  • 举报
回复
恭喜,接分
--小F-- 2010-03-10
  • 打赏
  • 举报
回复
引用 12 楼 timleaf 的回复:
稀里糊涂解决了...
SELECT
S.ACD,
S.ANM,
S.SCD,
M.ICD,
M.JAN,
S.SNM,
SW.[WEEK],
SW.CNT * M.BUNDLE AS CNT
FROM
#MASTER M
INNER JOIN
M_I I
ON
I.JAN = M.JAN
INNER JOIN
#SInfo S
ON
M.S_CD = S.SCD
LEFT JOIN
S_W_S_I SW
ON
I.I_CD = SW.I_CD
AND
M.SCD2 = SW.S_CD
WHERE
SW.CNT * M.BUNDLE <> 0
将这个字查询提前放入一个临时表中,然后再行列转换...
就没有问题了...但还是希望能知道为什么。
希望有人回答一下...

莫非是临时表优化了你的语句?
TimLeaf 2010-03-10
  • 打赏
  • 举报
回复
稀里糊涂解决了...
SELECT
S.ACD,
S.ANM,
S.SCD,
M.ICD,
M.JAN,
S.SNM,
SW.[WEEK],
SW.CNT * M.BUNDLE AS CNT
FROM
#MASTER M
INNER JOIN
M_I I
ON
I.JAN = M.JAN
INNER JOIN
#SInfo S
ON
M.S_CD = S.SCD
LEFT JOIN
S_W_S_I SW
ON
I.I_CD = SW.I_CD
AND
M.SCD2 = SW.S_CD
WHERE
SW.CNT * M.BUNDLE <> 0
将这个字查询提前放入一个临时表中,然后再行列转换...
就没有问题了...但还是希望能知道为什么。
希望有人回答一下...
SQL77 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 sql77 的回复:
PRINT DATALENGTH(@strSql)的结果是:5373,

应该用LEN()

弄错,晕,DATALENGTH这个是对的
TimLeaf 2010-03-09
  • 打赏
  • 举报
回复
引用 3 楼 sql77 的回复:
PRINT DATALENGTH(@strSql)的结果是:5373,

应该用LEN()

DATALENGTH
返回任何表达式所占用的字节数。
LEN
返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格。
根据帮助文档的叙述,我认为选择DATALENGTH没有错...
TimLeaf 2010-03-09
  • 打赏
  • 举报
回复
引用 2 楼 bancxc 的回复:
难道是列太多了》。。。。。。。。。。。。。。。。

行列转换的一共60列,加上表头,一共65列。
TimLeaf 2010-03-09
  • 打赏
  • 举报
回复
DECLARE @strSql VARCHAR(8000)
SET @strSql ='
SELECT
B.ACD,
B.ANM,
B.SCD,
B.ICD,
B.SNM'
SELECT
@strSql = @strSql + ',SUM(CASE B.[WEEK] WHEN ''' + CAST(A.[WEEK] AS VARCHAR) + ''' THEN B.CNT ELSE NULL END) AS ''' + CAST(A.[WEEK] AS VARCHAR) + ''''
FROM
(
SELECT
[WEEK]
FROM
#YEARWEEK
) A
SET @strSql = @strSql + '
FROM
(
SELECT
S.ACD,
S.ANM,
S.SCD,
M.ICD,
M.JAN,
S.SNM,
SW.[WEEK],
SW.CNT * M.BUNDLE AS CNT
FROM
#MASTER M
INNER JOIN
M_I I
ON
I.JAN = M.JAN
INNER JOIN
#SInfo S
ON
M.S_CD = S.SCD
LEFT JOIN
S_W_S_I SW
ON
I.I_CD = SW.I_CD
AND
M.SCD2 = SW.S_CD
WHERE
SW.CNT * M.BUNDLE <> 0
) B
GROUP BY
B.ACD,
B.ANM,
B.SCD,
B.ICD,
B.SNM
ORDER BY
B.ICD,
B.SCD
'
#YEARWEEK 中有60条数据...
nianran520 2010-03-09
  • 打赏
  • 举报
回复
贴代码。。。。。。。。。。。。。。。


黄_瓜 2010-03-09
  • 打赏
  • 举报
回复
无数据无真相....................
SQL77 2010-03-09
  • 打赏
  • 举报
回复
PRINT DATALENGTH(@strSql)的结果是:5373,

应该用LEN()
bancxc 2010-03-09
  • 打赏
  • 举报
回复
难道是列太多了》。。。。。。。。。。。。。。。。
ws_hgo 2010-03-09
  • 打赏
  • 举报
回复
代码贴出来看看..................

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧