テーブル列のordinal_positionを使用して列データを選択することは可能ですか?序数位置を使用することは悪い習慣ですが、1回限りのデータインポートプロセスでは、序数位置を使用して列データを取得できる必要があります。
例えば
create table Test(
Col1 int,
Col2 nvarchar(10)
)
使用する代わりに
select Col2 from Test
書いてもいいですか
select "2" from Test -- for illustration purposes only
あなたは次のようなことをしなければなりません
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)
列の数は知っているが、名前と型がわからない場合は、次のトリックを使用できます。
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列ある場合、この方法はあまり役に立ちませんが、定義済みの列数が少ないテーブルではうまく機能します。
このクエリを使用できます
select * from information_schema.columns
列の順序位置を取得します。 Michael Harenが書いたように、コードまたは列の位置を渡すsprocで、これを使用して動的クエリを作成する必要があります。
FWIW、これは純粋な悪です。
また、deathofratsは正しいです。位置に基づいて列名を含む通常のクエリを作成するため、実際にこれを行うことはできません。
はい、システムテーブルにいくつかの本当にいヒットを出すことでこれを行うことができます。おそらく、ダイナミックSQLの世界に陥る必要があるでしょう。
私は本当に、このアプローチを本当にお勧めしません。
それがあなたを阻止しなかったなら、これはあなたを始めるかもしれません( ref ):
select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
列数がわかっている場合、1つの方法は、その列数でデータをtmpテーブルに転送し、一時テーブルから選択することです...
declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant)
insert into @tmp
select * from Test
select field2 from @tmp
いいえ、私の知る限り、順序位置に基づいて列を選択することはできません。
Transact SQLリファレンスを見ると、できることを示唆するものは何もありません( http://msdn.Microsoft.com/en-us/library/ms176104(SQL.90).aspx )。
あなたが持っているオプションは条件を使用しています:あなたの例では:
SELECT
CASE YourColumnNumber
WHEN "1" THEN Col1
WHEN "2" THEN Col2
ELSE "?"
END AS Result
FROM Test
スキーマに行くと、クエリが遅くなります...
できるとは思わない。 @Michael Harenが示したように、ORDER BY句で序数位置を使用できますが、SQL Serverの他の場所で使用される位置を見たことはありません。
一時的なデータインポートでどのような問題が発生するのかわかりません。おそらく不幸な列名でしょうか。もう少し説明してもらえますか?
動的SQLを使用する以外にこれを行う方法は知りません。多分、序数の値を使用しなければならないと思う理由についてもう少し情報を含めると、ここで誰かがその問題を回避する方法についてアドバイスをくれるでしょう。
編集:あなたは別のコメントでこれにある程度答えたことがわかります。詳細を教えていただけますか?インポートプロシージャやテーブル定義