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

Sql 无法将CTE结果分配给varchar变量?,sql,sql-server,sql-server-2008,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 ); 但是,它的语法不正确(下面显示了错误消息)。我必须将其转换为子查询吗?我试图避免将CTE扩展到多个地方

我正在尝试编写以下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子句或更改跟踪上下文子句,则前一条语句必须以分号终止

更新:

xml的
排序依据
使
选择@s=…
我认为这正是您试图分配值的方式。请尝试使用以下方法:

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时的一项要求


我用
选择“test”作为值来运行上面的操作
定义CTE,而不是您的查询,它按预期工作。

好的,我算出了。不能在一个declare和initialization语句中完成

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

您需要将
@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.
10
1.
10
2.
20
2.
20

xml的
可能使它不可行?我不确定。我现在无法测试它。我建议尝试我上面提供的方法。您遇到的错误似乎与使用
for xml
…“当CTE用于作为批处理一部分的语句时,它前面的语句必须后跟分号。”
使用temp作为(选择…for xml…
需要更改为
使用c作为(…),temp(value)作为(…)
。有人能给我解释一下为什么
SELECT@s=
有效,而
SET@s=
无效?@Abe-“创意的秘诀是忘记来源”+1。