无法将CTE结果分配给varchar变量?

ca9*_*3d9 10 sql sql-server sql-server-2008

我正在尝试编写以下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
);
Run Code Online (Sandbox Code Playgroud)

但是,它的语法不正确(以下显示错误消息).我必须将其转换为子查询吗?我试图避免在多个地方扩展CTE.

关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.

更新:
for xmlorder by品牌select @s = ...

Mik*_*son 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
Run Code Online (Sandbox Code Playgroud)

结果:

<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>
Run Code Online (Sandbox Code Playgroud)


Abe*_*ler 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
Run Code Online (Sandbox Code Playgroud)

正如错误消息所述,您真正的问题是CTE之前的语句没有以;使用CTE时的要求终止.

我运行上面的select 'test' as value定义CTE而不是你的查询,它按预期工作.


ca9*_*3d9 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
Run Code Online (Sandbox Code Playgroud)

  • @Abe - _“原创的秘诀是忘记来源”_+1给你的答案。 (2认同)