Подтвердить что ты не робот

Можно ли выбрать данные сервера sql, используя порядковый номер столбца

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

Итак, например

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

)

вместо

select Col2 from Test

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

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

Ответ 1

Вам нужно будет сделать что-то вроде

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)

Ответ 2

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

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]. Этот метод не очень полезен, если в вашей таблице имеется 100 столбцов, но он хорошо работает для таблиц с небольшим предопределенным количеством столбцов.

Ответ 3

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

select * from information_schema.columns

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

insert into @tmp
select * from Test

select field2 from @tmp

Ответ 7

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

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

Ответ 8

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

EDIT: Я вижу, что вы в какой-то степени ответили на это в другом комментарии. Можете ли вы предоставить более подробную информацию? Определения импорта и/или таблиц импорта?

Ответ 9

У вас есть опция: В вашем примере:

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

Переход к схеме замедлит запрос, я боюсь...

Ответ 10

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

SELECT Col1, Col2, ROW_NUMBER() OVER (ORDER BY Col1) FROM Test WHERE ROW_NUMBER() Over (Order BY Col1) Между @Position AND @Position

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