2012-03-02 7 views
9

मैं निम्नलिखित 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 
); 

हालांकि, यह गलत वाक्यविन्यास है (निम्नलिखित त्रुटि संदेश दिखाता है)। क्या मुझे इसे सबक्वायरीज़ में परिवर्तित करना है? मैं कई जगहों पर सीटीई का विस्तार करने से बचने की कोशिश कर रहा हूं।

कीवर्ड 'के साथ' के भीतर गलत वाक्यविन्यास। यदि यह कथन एक सामान्य तालिका अभिव्यक्ति है, एक xmlnamespaces खंड या परिवर्तन ट्रैकिंग संदर्भ खंड, पिछला कथन अर्धविराम से समाप्त होना चाहिए।

अद्यतन:
for xml और order by बनाता select @s = ...

उत्तर

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

परिचित लग रहा है ... –

+2

@Abe - _ "मौलिकता का रहस्य स्रोत को भूलना है" _ +1 आपके उत्तर में। –

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 

त्रुटि संदेश राज्यों के रूप में, अपने असली मुद्दा है कि आपके CTE से पहले बयान एक ; जो एक आवश्यकता है जब एक CTE का उपयोग कर के साथ समाप्त नहीं है।

मैं ऊपर से भाग गया select 'test' as value आपकी क्वेरी के बजाय सीटीई को परिभाषित करता है और यह अपेक्षा के अनुसार काम करता है।

+0

'xml' के लिए शायद यह संभव नहीं है? – ca9163d9

+0

मुझे यकीन नहीं है। मैं फिलहाल इसका परीक्षण करने में सक्षम नहीं हूं। मैं ऊपर प्रदान की गई विधि को आजमाने की सलाह दूंगा। आपको जो त्रुटि मिल रही थी वह 'xml' के उपयोग से संबंधित नहीं है ... –

+0

"जब एक बैच का हिस्सा है जो एक सीटीई का उपयोग किया जाता है, तो इससे पहले का बयान अर्धविराम । " – HABO

10

आप काम से @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> 
संबंधित मुद्दे