当尝试包装查询以进行进一步处理时,我只需在查询周围加上括号就会出错。请参阅下面的查询,如果我只是删除包装括号,则查询有效。但是当我使用括号时,我得到了这个错误:
关键字'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
)
任何人都知道为什么会这样?
谢谢!
答案 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