Не можете присвоить результат CTE переменной varchar? - PullRequest
10 голосов
/ 03 марта 2012

Я пытаюсь написать следующий 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 в нескольких местах.

Неправильный синтаксис рядом с ключевым словом «с».Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен заканчиваться точкой с запятой.for xml и order by составляют select @s = ...

Ответы [ 3 ]

11 голосов
/ 03 марта 2012

Вам необходимо отделить декларацию @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>
7 голосов
/ 03 марта 2012

Я думаю, что именно так вы пытаетесь присвоить значение. Попробуйте использовать следующий метод:

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 вместо вашего запроса, и он работал как ожидалось.

3 голосов
/ 03 марта 2012

ОК, я понял это.Это нельзя сделать одним оператором объявления и инициализации.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...