10
votes

Impossible d'attribuer le résultat CTE à une variable Varcharne?

J'essaie d'écrire le SQL suivant. xxx

Cependant, c'est une syntaxe incorrecte (ce qui suit affiche le message d'erreur). Dois-je le convertir en sous-requêtes? J'essaie d'éviter d'élargir le CTE dans plusieurs endroits.

Syntaxe incorrecte près du mot clé "avec". Si cette déclaration est une expression de table commune, une clause XMLNamesPaces ou une clause de contexte de suivi des modifications, l'instruction précédente doit être terminée avec un point-virgule.

mise à jour:

Le pour xml et commande par fait SELECT @s = ...


0 commentaires

3 Réponses :


7
votes

Je pense que c'est comme si vous essayez d'attribuer la valeur. Essayez d'utiliser la méthode suivante à la place:

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


5 commentaires

Le pour XML le rend probablement pas réalisable?


Je ne suis pas sûr. Je ne suis pas capable de le tester pour le moment. Je recommanderais d'essayer la méthode que j'ai fournie ci-dessus. L'erreur que vous obteniez ne semble pas être liée à l'utilisation de pour xml ...


"Lorsqu'un CTE est utilisé dans une déclaration faisant partie d'un lot, la déclaration avant qu'elle doit être suivie d'un point-virgule."


avec TEMP comme (Sélectionnez ... pour XML ...) doit être remplacé par avec C comme (...), TEMP (valeur) comme (...) .


Quelqu'un pourrait-il vous expliquer pourquoi SELECT @s = fonctionne, mais SET @s = n'est pas?



3
votes

OK, je l'ai compris. Il ne peut pas être fait dans une déclaration de déclaration et d'initialisation.

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


1 commentaires

@Be - "Le secret de l'originalité est d'oublier la source" +1 à votre réponse.



11
votes

Vous devez séparer la déclaration de @s code> à partir de l'affectation.

Quelque chose comme ça fonctionnera pour vous. p>

<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>


0 commentaires