2011-08-02 8 views
0

フィールド(a:int、b:int、c:int、d:int)を持つテーブルがあります 私はストアプロシージャを作成しています。このストアプロシージャは、文字列( 'a'または 'b'または 'c'または 'd')を返し、その列に合計を戻す必要があります。 私は、SQLサーバーに2005カラム名を知っている値を選択

+0

私はcolumn_nameを使用してexecと一緒に使うことができますが、execは別の接続を開くことができます。私は別の接続を開けたくありません。 – Masoud

+0

私は他の方法を知らない。ストアドプロシージャで直接SQLコードを構築しない理由 – niktrs

+0

書くとき:a、bをxから選択する---> aとbは特殊なポインタです。彼らは単純な文字列ではありません。そのポインタを見つける方法があるはずです。 – Masoud

答えて

1

はあなたを再設計してください複数の列に対して同じ操作を実装しようとしていないようにします。 SQLテーブルがスプレッドシートに似ているからといって、それはそのように扱うべきではありません。

複数の列がある場合、複数の行がある場合は複数の列があり、これらの値を区別するために列が追加されている場合は、何らかの形の属性分割が行われているようです年の各月の "値"を表す12列よりも、月と "値"を格納する2つの列を持つ必要があります)。

+0

あなたは正しいです。再設計は最善の方法と思われる。ご意見ありがとうございます。しかし、このテーブルはプログラム内のフォームと同じだと考えています。それで、それを扱うことは難しいようになります。とにかく、column_nameをパラメータの文字列として持つだけでデータに到達する方法があると思います。 – Masoud

+0

私は最高の答えと思われます。そして私はそれに印をつけます。しかし、もう少し話してください。 – Masoud

+0

動的コードを使用しないと(あなたが却下したように)、それを行う方法はありません。単一のSQL文は、常に同じ「形状」を持つ結果セットを生成します。つまり、常に同じ列を持ちます。「同じ」は、同じ名前とタイプを持つことを意味します。選択した列を変更することはできないため(要求されたものより簡単なタスク)、要件を達成することはできません。 –

2

を使用していますが、プロシージャ内の動的SQLを使用して

SELECT SUM(
CASE @col -- the param of the stored procedure 
WHEN 'a' THEN col_a 
WHEN 'b' THEN col_b 
WHEN 'c' THEN col_c 
ELSE col_d END) AS sum_of_column 
FROM my_table 

代替を要約するために適切な列を選択するためにCASE式を使用することができます

DECLARE @sql AS VARCHAR(MAX) 

SET @sql = 'SELECT SUM(' + @col +') FROM my_table' 
EXEC (@sql) 
+0

私は大文字小文字を使いたくありません。 500列あるかどうか想像してみてください。体系的な方法ではありません。 – Masoud

+1

動的SQLの代替案はどうですか? – niktrs

+0

私はcolumn_nameを使用してexecと一緒に使うことができますが、execは別の接続を開くことができます。私は別の接続を開こうとしません – Masoud

関連する問題