SQLServer存储过程编译错误

cacom1232004 2009-07-11 12:06:16
为什么我在SQL EXPRESS2005能编译的存储过程,确在sql Server2000中编译不过呢?代码如下:
/****************************************************************************/
PROCEDURE [dbo].[pr_GetNewsTypeTree]
AS
BEGIN
WITH acTree(newsTypeId, newsTypeName ,ParentId, depth, sort) -----此行编译错误
AS
(
SELECT newsTypeId, newsTypeName, ParentId, 0 as depth,
CONVERT(varchar(255), right('0000' + CONVERT(varchar(255), ShowOrder), 4))
FROM NewsType
WHERE ParentId=-1

UNION ALL
SELECT a.newsTypeId, a.newsTypeName, a.ParentId, depth + 1,
CONVERT(varchar(255), sort + ', ' + CONVERT(varchar(255), right('0000' + CONVERT(varchar(255),a.ShowOrder), 4)))
FROM NewsType a
INNER JOIN acTree t
ON a.parentId = t.newsTypeId
)

SELECT newsTypeId, newsTypeName, ParentId, depth, sort
FROM acTree
ORDER BY Sort
OPTION (MAXRECURSION 10);
END
/****************************************************************************/

...全文
79 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cacom1232004 2009-07-13
  • 打赏
  • 举报
回复
多谢csdyyr兄弟的代码 我自己整理了下 代码如下(比较我提问时的代码):

Create Procedure pr_GetNewsTypeTree
As
Begin
Declare @t_acTree Table(newsTypeId int, newsTypeName varchar(50),ParentId int, depth int, sort varchar(50))
Declare @depth int
set @depth = 0

Insert into @t_acTree
Select NewsTypeId, NewsTypeName, ParentId, @depth,
CONVERT(varchar(255), right('0000' + CONVERT(varchar(255), ShowOrder), 4)) as sort
From NewsType Where parentId=-1

While @@ROWCOUNT > 0
BEGIN
SET @depth = @depth + 1
Insert into @t_acTree
Select a.NewsTypeId, a.NewsTypeName, a.ParentId, @depth,
CONVERT(varchar(255), b.sort + ', ' + CONVERT(varchar(255), right('0000' + CONVERT(varchar(255),a.ShowOrder), 4)))
From NewsType as a, @t_acTree as b
Where a.parentId = b.newsTypeId and b.depth = @depth - 1
END

Select * from @t_acTree Order by sort


csdyyr 2009-07-11
  • 打赏
  • 举报
回复
--测试数据   深度排序     
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/

--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO

--调用函数查询002及其所有子节点
SELECT a.*
FROM tb a,f_Cid('002') b
WHERE a.ID=b.ID
/*--结果
ID PID Name
------ ------- ----------
002 001 烟台市
004 002 招远市
--*/



--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/


csdyyr 2009-07-11
  • 打赏
  • 举报
回复
SQL 2000用循环。
feixianxxx 2009-07-11
  • 打赏
  • 举报
回复
WITH acTree(newsTypeId, newsTypeName ,ParentId, depth, sort) -----此行编译错误
2000不支持
cacom1232004 2009-07-11
  • 打赏
  • 举报
回复
谢谢你的解答
sql server2005能支持吧?!!
如何转化with为2000能支持的方式了,最好给出你的列子.
csdyyr 2009-07-11
  • 打赏
  • 举报
回复
WITH acTree(newsTypeId, newsTypeName ,ParentId, depth, sort) -----此行编译错误
-->
这是SQL 2005的新特性CTE。
playwarcraft 2009-07-11
  • 打赏
  • 举报
回复
SQl2000不支持with。。這種寫法。。。
ChinaJiaBing 2009-07-11
  • 打赏
  • 举报
回复

--sql2000不支持cte....

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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