我正在尝试编写以下SQL。
declare @s varchar(max) = (
with c as (select ...)
select a, b, c, d, ....
from ... join c on .... join c on .... join c on ....
order by ...
for xml raw('...'), elements
);
但是,它的语法不正确(以下显示错误消息)。我必须将其转换为子查询吗?我试图避免在多个地方扩大CTE。
关键字'with'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号结束前一个语句。
更新
for xml
和order by
生成select @s = ...
答案 0 :(得分:11)
您需要将@s
的声明与作业分开。
这样的事情对你有用。
declare @T table
(
ID int,
Col1 int
)
insert into @T values(1, 10),(2, 20)
declare @s varchar(max)
;with C as
(
select *
from @T
)
select @s =
(
select *
from C as C1
inner join C as C2
on C1.ID = C2.ID
for xml raw, elements
)
select @s
结果:
<row>
<ID>1</ID>
<Col1>10</Col1>
<ID>1</ID>
<Col1>10</Col1>
</row>
<row>
<ID>2</ID>
<Col1>20</Col1>
<ID>2</ID>
<Col1>20</Col1>
</row>
答案 1 :(得分:7)
我认为这只是你试图分配价值的方式。请尝试使用以下方法:
declare @s varchar(max);
with temp as
(
select ....
from ... join c on .... join c on .... join c on ....
for xml raw('...'), elements
)
select @s = value from temp
select @s
正如错误消息所述,您的真正问题是CTE之前的陈述未以;
终止,这是使用CTE时的要求。
我运行上面的select 'test' as value
来定义CTE而不是您的查询,它按预期工作。
答案 2 :(得分:3)
好的,我明白了。它不能在一个声明和初始化语句中完成。
declare @s varchar(max);
with c as (select 1 a union all select 2 union all select 3)
, x(s) as (select a from c order by a desc for xml raw('tr'), elements)
select @s = s from x