Можно ли выбрать данные сервера sql, используя порядковый номер столбца
Можно ли выбрать данные столбца с помощью ordinal_position для столбца таблицы? Я знаю, что использование порядковых позиций - это плохая практика, но для одноразового процесса импорта данных мне нужно иметь возможность использовать порядковое положение для получения данных столбца.
Итак, например
create table Test(
Col1 int,
Col2 nvarchar(10)
)
вместо
select Col2 from Test
могу написать
select "2" from Test -- for illustration purposes only
Ответы
Ответ 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
Это должно получить желаемые результаты, если я правильно прочитаю вопрос.