2012-03-02 17 views
9

Aşağıdaki SQL'i yazmaya çalışıyorum. Ancak, bu yanlış sözdizimi (Aşağıdaki hata iletisini gösterir) Ancak, bu yanlış bir sözdizimidir (Ancak aşağıdaki hata iletisini gösterir). Onu alt sorgulara dönüştürmek zorunda mıyım? CTE'yi birden çok yerde genişletmekten kaçınmaya çalışıyorum. 'Ile' anahtar sözcüğü yakınındaCTE sonucu bir değişken değişkenine atayamaz mı?

yanlış sözdizimi. Bu deyim bir ortak tablo ifadesi, bir xmlnamespaces maddesi veya bir değişiklik izleme bağlamı cümlesi ise, önceki ifadenin bir noktalı virgülle sonlandırılması gerekir.

Güncelleme:
for xml ve order by ben sadece sen değer atamak için çalışıyoruz yol olduğunu düşünüyorum select @s = ...

cevap

3

Tamam, bunu anladım. Bir beyan ve başlatma ifadesinde yapılamaz.

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

Tanıdık geliyor ... –

+2

@Abe - _ "özgünlüğün sırrı kaynağı unutacaksınız" cevabınıza _ + 1. –

7

yapar. yerine aşağıdaki yöntemi kullanarak deneyin: Hata mesajı devletler olarak

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 

, gerçek sorunun CTE önce ifadesi bir CTE kullanırken bir gerekliliktir bir ; ile sona olmamasıdır.

Ben Sorgunuzun yerine CTE tanımlayan select 'test' as value yukarıda koştu ve beklendiği gibi çalıştı.

+0

'xml' için muhtemelen öyle değil mümkün kılan nedir? – ca9163d9

+0

Emin değilim. Bunu şu anda test edemiyorum. Yukarıda verdiğim yöntemi denemenizi tavsiye ederim. Aldığınız hatanın 'xml' için kullanımı ile ilgili görünmüyor '... –

+0

" Bir toplu işin bir parçası olan bir deyimde CTE kullanıldığında, önce ifade bir noktalı virgülle takip edilmelidir ." – HABO

10

Sen görevden @s ilanını ayırmak gerekir. Böyle

şey sizin için çalışacaktır.

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 

Sonuç:

<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> 
İlgili konular