web-dev-qa-db-ja.com

列の序数位置を使用してSQLサーバーデータを選択することは可能ですか?

テーブル列のordinal_positionを使用して列データを選択することは可能ですか?序数位置を使用することは悪い習慣ですが、1回限りのデータインポートプロセスでは、序数位置を使用して列データを取得できる必要があります。

例えば

create table Test(
    Col1 int,
    Col2 nvarchar(10)

)

使用する代わりに

select Col2 from Test

書いてもいいですか

select "2" from Test -- for illustration purposes only
33
rams

あなたは次のようなことをしなければなりません

declare @col1 as varchar(128)
declare @col2 as varchar(128)
declare @sq1 as varchar(8000) 

select @col1 = column_name from information_schema.columns where table_name = 'tablename'
and ordinal_position = @position

select @col2 = column_name from information_schema.columns where table_name = 'tablename'
and ordinal_position = @position2

set @sql = 'select ' + col1 ',' + col2 'from tablename' 

exec(@sql)
14
Booji Boy

列の数は知っているが、名前と型がわからない場合は、次のトリックを使用できます。

select NULL as C1, NULL as C2 where 1 = 0 
-- Returns empty table with predefined column names
union all
select * from Test 
-- There should be exactly 2 columns, but names and data type doesn't matter

その結果、[C1]と[C2]の2つの列を持つテーブルが作成されます。テーブルに100列ある場合、この方法はあまり役に立ちませんが、定義済みの列数が少ないテーブルではうまく機能します。

11
Pavel Sinkevich

このクエリを使用できます

select * from information_schema.columns

列の順序位置を取得します。 Michael Harenが書いたように、コードまたは列の位置を渡すsprocで、これを使用して動的クエリを作成する必要があります。

FWIW、これは純粋な悪です。

また、deathofratsは正しいです。位置に基づいて列名を含む通常のクエリを作成するため、実際にこれを行うことはできません。

7
Booji Boy

はい、システムテーブルにいくつかの本当にいヒットを出すことでこれを行うことができます。おそらく、ダイナミックSQLの世界に陥る必要があるでしょう。

私は本当に、このアプローチを本当にお勧めしません。

それがあなたを阻止しなかったなら、これはあなたを始めるかもしれません( ref ):

select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
2
Michael Haren

列数がわかっている場合、1つの方法は、その列数でデータをtmpテーブルに転送し、一時テーブルから選択することです...

declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant)

insert into @tmp
select * from Test

select field2 from @tmp
1
craigl

いいえ、私の知る限り、順序位置に基づいて列を選択することはできません。

Transact SQLリファレンスを見ると、できることを示唆するものは何もありません( http://msdn.Microsoft.com/en-us/library/ms176104(SQL.90).aspx )。

1
Eric Minkes

あなたが持っているオプションは条件を使用しています:あなたの例では:

    SELECT 
     CASE YourColumnNumber 
      WHEN "1" THEN Col1
      WHEN "2" THEN Col2
      ELSE "?"
     END AS Result
    FROM Test

スキーマに行くと、クエリが遅くなります...

1
Damien Goor

できるとは思わない。 @Michael Harenが示したように、ORDER BY句で序数位置を使用できますが、SQL Serverの他の場所で使用される位置を見たことはありません。

一時的なデータインポートでどのような問題が発生するのかわかりません。おそらく不幸な列名でしょうか。もう少し説明してもらえますか?

0
robsoft

動的SQLを使用する以外にこれを行う方法は知りません。多分、序数の値を使用しなければならないと思う理由についてもう少し情報を含めると、ここで誰かがその問題を回避する方法についてアドバイスをくれるでしょう。

編集:あなたは別のコメントでこれにある程度答えたことがわかります。詳細を教えていただけますか?インポートプロシージャやテーブル定義

0
Tom H