Можно ли выбрать данные сервера SQL, используя порядковый номер столбца - PullRequest
32 голосов
/ 15 декабря 2008

Можно ли выбрать данные столбца, используя ordinal_position для столбца таблицы? Я знаю, что использование порядковых позиций - плохая практика, но для одноразового процесса импорта данных мне нужно иметь возможность использовать порядковый номер для получения данных столбца.

Так например

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

)

вместо использования

select Col2 from Test

могу я написать

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

Ответы [ 10 ]

14 голосов
/ 15 декабря 2008

Вы должны сделать что-то вроде

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)
11 голосов
/ 14 августа 2015

Если вы знаете количество столбцов, но не знаете их имен и типов, вы можете использовать следующий трюк:

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

В результате у вас будет таблица с 2 столбцами [C1] и [C2]. Этот метод не очень полезен, если в вашей таблице 100 столбцов, но он хорошо работает для таблиц с небольшим предварительно определенным числом столбцов.

6 голосов
/ 15 декабря 2008

Вы можете использовать этот запрос

select * from information_schema.columns

чтобы получить порядковые позиции столбцов. Как писал Майкл Харен, вам нужно будет создать динамический запрос, используя его, либо в коде, либо во фрагменте, которому вы передаете позиции столбцов.

FWIW, это чистое зло.

Кроме того, deathofrats прав, вы не можете этого сделать, так как вы будете строить регулярный запрос с именами столбцов на основе позиции.

2 голосов
/ 15 декабря 2008

Да, вы могли бы сделать это с некоторыми действительно уродливыми попаданиями в системные таблицы. Вам, вероятно, нужно попасть в мир динамического SQL.

Я действительно, очень не рекомендую такой подход.

Если это вас не остановит, то это может помочь вам начать ( ref ):

select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
1 голос
/ 14 мая 2011

Если вам известно количество столбцов, одним из способов может быть передача данных в таблицу tmp с таким количеством столбцов и выбор из временной таблицы ...

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

insert into @tmp
select * from Test

select field2 from @tmp
1 голос
/ 15 декабря 2008

Нет, насколько я знаю, вы не можете выбирать столбцы на основе их порядкового положения.

Когда вы смотрите на справочник по транзакционному SQL, вам нечего предложить (http://msdn.microsoft.com/en-us/library/ms176104(SQL.90).aspx).

0 голосов
/ 12 января 2016

У вас есть возможность использовать условия: В вашем примере:

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

Боюсь, что переход к схеме замедлит запрос ...

0 голосов
/ 15 декабря 2008

Если вы используете MS SQL 2005, вы можете использовать функцию ROW_NUMBER.

ВЫБРАТЬ Col1, Col2, ROW_NUMBER () OVER (ORDER BY Col1) ОТ теста WHERE ROW_NUMBER () более (Order BY Col1) между @Position и @ Position

Это должно дать вам желаемый результат, если я правильно читаю вопрос.

0 голосов
/ 15 декабря 2008

Я не знаю ни одного способа сделать это за исключением использования динамического SQL. Возможно, если вы включите немного больше информации о том, почему вы чувствуете, что должны использовать порядковые значения, кто-то здесь может дать вам совет, как обойти эту проблему.

РЕДАКТИРОВАТЬ: я вижу, что вы ответили на это в некоторой степени в другом комментарии. Можете ли вы предоставить больше подробностей? Процедура импорта и / или определения таблиц?

0 голосов
/ 15 декабря 2008

Не думаю, что ты можешь. Как показал @Michael Haren, вы можете использовать порядковые позиции в предложениях ORDER BY, но я никогда не видел, чтобы они использовались где-либо еще в SQL Server.

Я не уверен, с какой проблемой вы сталкиваетесь с вашим одноразовым импортом данных, с которым это могло бы помочь - предположительно какое-то неудачное имя столбца? Можете ли вы объяснить немного больше?

...