2012-03-02 8 views
9

次のSQLを記述しようとしています。CTEの結果をvarchar変数に割り当てることはできませんか?

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句または変更追跡コンテキスト句である場合、前の文はセミコロンで終了する必要があります。

更新:
for xmlorder byselect @s = ...

答えて

3

わかりました。 1つの宣言文と初期化文では実行できません。

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 - _ "独創性の秘密は、あなたの答えに"源を忘れることです。 –

7

私はそれはあなたが値を代入しようとしているだけの方法だと思います。代わりに以下の方法を使用してみてください:あなたのCTEは、CTEを使用するときの要件です;で終了していない前に、エラーメッセージ状態として

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を定義するselect 'test' as valueで上記を実行し、期待どおりに動作しました。

+0

'xml'ため、おそらくそれは現実的ではないのですか? – ca9163d9

+0

わかりません。私は現時点でそれをテストすることができません。私は上記の方法を試してみることをお勧めします。取得したエラーは、 'for xml'の使用には関係していないようです... –

+0

"バッチの一部であるステートメントでCTEが使用される場合、ステートメントの前にセミコロン" – 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> 
関連する問題