带括号的周围查询导致错误对于XML

时间:2018-06-13 19:32:54

标签: sql-server sql-server-2008 tsql

当尝试包装查询以进行进一步处理时,我只需在查询周围加上括号就会出错。请参阅下面的查询,如果我只是删除包装括号,则查询有效。但是当我使用括号时,我得到了这个错误:

  

关键字'for'

附近的语法不正确
(
select '; ' + [NAME]  
from (select a.[NAME] as 'NAME'
      from [MS].[dbo].[A_POSITIONS] a
      where a.ID = 208418           
      except 
      select top 1 b.[NAME] 
      from [MS].[dbo].[A_POSITIONS] b
      where b.ID = 208418) as c
for XML PATH(''),TYPE
)

任何人都知道为什么会这样?

谢谢!

1 个答案:

答案 0 :(得分:0)

在查询周围单独添加括号会导致错误,但如果在左括号前键入SELECT代码将运行,这意味着您可以将其用于进一步处理:

if OBJECT_ID('A_POSITIONS') is not  null
drop table [dbo].[A_POSITIONS]

create table [dbo].[A_POSITIONS]([ID] int,[Name] varchar(100))

insert into [dbo].[A_POSITIONS] values
(208418, 'one'),(208418, 'two'),(208418, 'three'),(208418, 'four'),(208418, 'five')

select
(
select '; ' + [NAME]  
from (select a.[NAME] as 'NAME'
    from [MS].[dbo].[A_POSITIONS] a
    where a.ID = 208418           
    except 
    select top 1 b.[NAME] 
    from [MS].[dbo].[A_POSITIONS] b
    where b.ID = 208418) as c
for XML PATH(''),TYPE
) 

最后一个考虑因素:没有TOP子句的ORDER BY关键字是不确定的。

来自Microsoft文档(更多信息here):

  

当TOP与ORDER BY子句一起使用时,结果集仅限于前N个有序行;否则,它以未定义的顺序返回前N行

因此,您应该考虑在查询的第二部分添加ORDER BY

select '; ' + [NAME]  
from (select a.[NAME] as 'NAME'
    from [MS].[dbo].[A_POSITIONS] a
    where a.ID = 208418           
    except 
    select top 1 b.[NAME] 
    from [MS].[dbo].[A_POSITIONS] b
    where b.ID = 208418
    --Add an ORDER BY clause here
) as c
for XML PATH(''),TYPE