@RusCosinus

Как понять порядок столбцов в таблице в SQL (MS SQL)?

Добрый день.

Что хочется: хочется получить список полей временной таблицы с их типами, но именно в том порядке, в котором они расположены в таблице.
Получить нужные мне данные в произвольном порядке я могу

Набиваем временную таблицу любыми полями из нескольких таблиц:
create table table_01
 (
 id numeric(15,0) identity(1,1)
 ,product_id numeric(15,0)
 ,name varchar(50)
 ,short_name varchar(10)
 )

  create table table_02
 (
 id numeric(15,0) 
 ,group_id numeric(15,0)
 ,name varchar(100)
 ,is_auto bit
 ,date_start datetime
 )

insert into table_01
(product_id,name,short_name)
select 1,'product_16','pr16'
union all
select 1,'product_85','pr85'
union all
select 2,'product_88','pr88'
union all
select 2,'product_22','pr22'
union all
select 1,'product_14','pr14'

insert into table_02
(id,group_id,name,is_auto,date_start)
select 1,1,'group_01',1,'20230101'
union all
select 2,4,'group_02',0,'20230301'
union all
select 3,2,'group_03',0,'20230501'


select t1.*
		,t2.id as t2_id
		,t2.group_id as group_id
		,t2.name as t2_name
		,t2.is_auto as is_auto
		,t2.date_start as date_start
into #temp_tbl
from table_01 t1
inner join table_02 t2 on t1.ID=t2.id

select *
from #temp_tbl


Тут в селекте видно, что столбцы отображаются, как и должно, в порядке их объявления
648870a49788e116487875.png

Далее я получаю данные по размерности полей

IF OBJECT_ID(N'tempdb.dbo.#pTmpTableInfo',N'U') IS NOT NULL
	DROP table dbo.#pTmpTableInfo

create table #pTmpTableInfo
(
column_name nvarchar(256)
,Type nvarchar(256)
,max_length smallint
,precision tinyint
,scale tinyint
,is_nullable bit
,declare_type varchar(100)
,declare_text varchar(1000)
)

insert into #pTmpTableInfo
SELECT column_name = c.name
		,[type] = t.name
		,c.max_length
		,c.precision
		,c.scale
		,c.is_nullable 
		,''
		,''
FROM tempdb.sys.columns AS c 
INNER JOIN tempdb.sys.types AS t ON c.system_type_id = t.system_type_id
								AND t.system_type_id = t.user_type_id
WHERE [object_id] = OBJECT_ID(N'tempdb.dbo.#temp_tbl');

select *
from #pTmpTableInfo

drop table table_01
drop table table_02
drop table #temp_tbl


648871703df24777608361.png

И тут в селекте видно, что они (что в общем логично) вразнобой. Не пойму, как мне сделать так, чтобы они были в том порядке, в котором мне нужно. Скорее всего нужно что-то придумать с row_number, но я не могу придумать по чему маркировать.

Буду благодарен за идеи :)
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
Adamos
@Adamos
ORDER BY tempdb.sys.columns.column_id
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Ну любой API который работает с metadata из курсора - всегда выдаст тебе колонки именно в том порядке
как и выдает фактический запрос. Для JDBC там была своя процедура https://www.baeldung.com/jdbc-database-metadata

Да и даже еслиб ты не знал про метадату - можно просто выбрать запрос который выдает 1 строку и взать из него типы полей тоже через какой- то API (JDBC/ODBC).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы