2010-12-10 15 views
2

サブクエリを使用して結果を取得しています(複数のレコードが返されています)。T-SQLのサブクエリで@variableを選択すると、構文エラーが発生する

サブクエリを単独で実行すると機能しますが、サブクエリとして使用すると構文エラーが原因で機能しなくなります。

次のコード

構文エラーとなる( '=' 不適切な構文周辺。)

declare @test varchar(1000) 
set @test = '' 

SELECT description, (SELECT @test = @test + FirstName 
       FROM EMP_tblEmployee 
       )select @test 
FROM EMP_tblCrew 

したがって、本質的に、サブクエリ

(SELECT @test = @test + FirstName 
        FROM EMP_tblEmployee 
        )select @test 

戻ります」 charliejohnjacob "

メインクエリ

SELECT description FROM EMP_tblCrew 

戻り、 "管理人"

だから私はそれが

用務員を言いたいです| charliejohnjacob

2フィールド、1レコード。

+2

何をしたいですか? –

+0

行を列に変換しようとしているのか、firstNameに空白を追加しようとしていますか – StingyJack

+0

すべての最初の名前を結果セットに連結しようとしたようですが、なぜですか?これが動作すれば、名前のピラミッドが作成されます。ここの意図は非常に疑わしい。 –

答えて

1

あなたのクエリは構文的に正しいものではなく、T-SQLパーサは時々エラーを非常に正確に報告しないという厄介な癖があります。これは、暗闇の中で刺しのビットですが、試してみてください。

私は、SQLサーバーがそのようにインラインを連結について感じているかどうかはわかりませんけれども、少なくとも一つのことを修正します
SELECT 
description, 
(SELECT FirstName + ' ' FROM EMP_tblEmployee FOR XML PATH('')) AS [Name Concat Result] 
FROM EMP_tblCrew 

を。また、テーブルがかなりの大きさであれば、varchar(1000)がオーバーフローする危険性があります。 varchar 8000でも、このようなクエリではあまりありません。

+0

こんにちは、私はちょうどそれを試みた、動作しなかった、同じエラー。 は@Test VARCHARを宣言(1000) セット@Test = '' \t SELECT説明、(@Test SELECT = @Test +姓 \t \t \t \t EMP_tblEmployee \t \t \t \t FROM)試験 としてEMP_tblCrew – Kukoy

+0

からのIFあなたは本当にカーソルやいくつかのCTE関数の使用について考えるかもしれない名前を連結したいと思っています。達成したいことを説明してください。さらに良いことに、あなたが望むものの結果セットをモックアップします。 –

+0

コメントのクエリにFROM句がありません。 –

1

「SQLを行を文字列に連結」を検索してみてください。これには多くの便利な解決法があります。

従業員を乗組員のテーブルに参加させる必要があるように見えます。そうすれば、デカルト製品(通常は何が必要でないか)を取得しないようにすることができます。

+0

これは恥ずかしいです、私はあなたの検索条件を使用して私のような質問のカップルを見つけました...入力のおかげで。 http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-single-text-string http://stackoverflow.com/questions/6899/is-there-a-way-to -create-a-mssql-function-to-join-multiple-rows-from-a-subquery – Kukoy

0

おそらく最も簡単なパスは、再帰的なCTE(共通テーブル式)を使用することです。その具体的な例は、https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

ノートである、これは基本的には、SQL 2008

別のパスを持っていることが必要ですEMP_tblEmployeeテーブルから連結された値を戻したユーザー定義関数を作成することです。あなたは2005年または2008年にこれを行うことができます。

関連する問題