36

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

たとえば

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

)

使用する代わりに

select Col2 from Test

書いてもいいですか

select "2" from Test -- for illustration purposes only
4

10 に答える 10

18

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

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 列ある場合はあまり役に立ちませんが、定義済みの列数が少ないテーブルではうまく機能します。

于 2015-08-14T11:50:42.547 に答える
16

あなたは次のようなことをしなければならないでしょう

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)
于 2008-12-15T14:45:17.467 に答える
8

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

select * from information_schema.columns

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

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

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

于 2008-12-15T14:39:11.660 に答える
3

はい、システムテーブルへのいくつかの非常に醜いヒットでこれを行うことができます。おそらく、動的 SQL の世界に陥る必要があるでしょう。

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

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

select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
于 2008-12-15T14:27:04.150 に答える
1

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

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

insert into @tmp
select * from Test

select field2 from @tmp
于 2011-05-14T15:31:13.150 に答える
1

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

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

于 2008-12-15T14:29:22.850 に答える
0

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

これが役立つ1回限りのデータインポートでどのような問題が発生しているのかわかりません-おそらくいくつかの不幸な列名ですか? もう少し説明していただけますか?

于 2008-12-15T14:39:23.657 に答える
0

動的SQLを使用する以外にこれを行う方法はわかりません。序数の値を使用する必要があると感じる理由についてもう少し情報を含めると、ここにいる誰かがその問題を回避する方法についてアドバイスをくれるかもしれません.

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

于 2008-12-15T14:51:53.257 に答える
-6

MS SQL 2005を使用している場合は、ROW_NUMBER関数を使用できます。

SELECT Col1、Col2、ROW_NUMBER()OVER(ORDER BY Col1)FROM Test WHERE ROW_NUMBER()Over(Order BY Col1)@Positionと@Positionの間

私が質問を正しく読んでいれば、それはあなたに望ましい結果をもたらすはずです。

于 2008-12-15T15:00:31.837 に答える