SQL Server的附近有语法错误('在递归查询

问题描述:

我试图将IBM DB2查询转换为SQL Server查询。我不是很熟悉与AS结构。SQL Server的附近有语法错误('在递归查询

DB2查询(工作)是:

with ZoneList (id, name, parent_name, parent_id, level) as 
(select id, name, '', parent_id, 1 as level 
from products.zones where id = 1 
union all 
select z.id, z.name, l.name, z.parent_id, level + 1 
from products.zones z, ZoneList l 
where z.parent_id = l.id) 
select id, name || ' (' || parent_name || ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 

和我的SQL Server版本是:

with ZoneList (id, name, cast((parent_name) as varchar(45)), parent_id, 
level) as 
(select id, name, cast(('') as varchar(45)), parent_id, 1 as level 
from products.zones where id = 1 
union all 
select z.id, z.name, cast((l.name) as varchar(45)), z.parent_id, level + 1 
from products.zones z, ZoneList l 
where z.parent_id = l.id) 
select id, name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 

我为了避免不兼容类型的错误增加了石膏,但现在我得到语法错误附近“(”

+0

,而不是'投((PARENT_NAME)为varchar(45))'在第一线,只需用''parent_name'--与ZoneList(ID,姓名,PARENT_NAME,PARENT_ID, 级)为' 。你说什么列名将是,所以你不需要类型声明或演员。 – ps2goat

试试这个:

;with ZoneList (id, name, parent_name, parent_id, level) 
as (
    select id 
     , name 
     , cast('' as varchar(45)) 
     , parent_id 
     , 1 as level 
    from products.zones 
    where id = 1 

    union all 

    select z.id 
     , z.name 
     , cast(l.name as varchar(45)) 
     , z.parent_id 
     , level + 1 
    from products.zones z 
     inner join ZoneList l 
      on z.parent_id = l.id 
    ) 
select id 
    , name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 

你不需要任何显式转换在第一线,因为在第一行,你枚举CTE的列,你没有定义自己的数据类型或大小等。

你甚至可能完全在CTE的顶部在你的CTE删除该列枚举,只要你的别名每一列,如:

;with ZoneList 
as (
    select id 
     , name 
     , cast('' as varchar(45)) as [parent_name] 
     , parent_id 
     , 1 as level 
    from products.zones 
    where id = 1 

    union all 

    select z.id 
     , z.name 
     , cast(l.name as varchar(45)) as [parent_name] 
     , z.parent_id 
     , level + 1 
    from products.zones z 
     inner join ZoneList l 
      on z.parent_id = l.id 
    ) 
select id 
    , name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 
+1

我也建议将隐式连接更改为显式连接。 –

+0

@ZoharPeled改进 –

+0

谢谢,它的工作! – Argentina

common table expression列清单是不t你会在哪里投出这个价值。

with ZoneList (id, name, parent_name, parent_id, level) as (
select 
    id 
    , name 
    , cast(('') as varchar(45)) as parent_name 
    , parent_id 
    , 1 as level 
from products.zones where id = 1 

union all 

select 
    z.id 
    , z.name 
    , cast((l.name) as varchar(45)) as parent_name 
    , z.parent_id 
    , level + 1 
from products.zones z 
    inner join ZoneList l 
    on z.parent_id = l.id 
) 
select 
    id 
    , name + ' (' + parent_name + ')' as description 
from ZoneList 
where level = 4 
order by ZoneList.name 
+2

我也建议将隐式连接更改为显式连接。 –

+0

@ZoharPeled良好的捕获 – SqlZim