Как понять порядок столбцов в таблице в 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 |
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
Тут в селекте видно, что столбцы отображаются, как и должно, в порядке их объявления
Далее я получаю данные по размерности полей
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 |
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
И тут в селекте видно, что они (что в общем логично) вразнобой. Не пойму, как мне сделать так, чтобы они были в том порядке, в котором мне нужно. Скорее всего нужно что-то придумать с row_number, но я не могу придумать по чему маркировать.
Буду благодарен за идеи :)
Дополнительно:
ORDER BY tempdb.sys.columns.column_id
Ответы:
Ну любой API который работает с metadata из курсора - всегда выдаст тебе колонки именно в том порядке
как и выдает фактический запрос. Для JDBC там была своя процедура https://www.baeldung.com/jdbc-database-metadata
Да и даже еслиб ты не знал про метадату - можно просто выбрать запрос который выдает 1 строку и взать из него типы полей тоже через какой- то API (JDBC/ODBC).
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для понимания порядка столбцов в таблице в SQL (MS SQL) можно воспользоваться следующими способами:
1. Использование команды DESCRIBE или DESC в SQL запросе. Например, для таблицы "users" запрос будет выглядеть следующим образом:
DESCRIBE users;DESCRIBE users;
Этот запрос вернет информацию о структуре таблицы "users", включая названия столбцов, их типы данных, длину и другие параметры.
2. Использование системной таблицы INFORMATION_SCHEMA.COLUMNS. Эта системная таблица содержит информацию о столбцах всех таблиц в базе данных. Можно выполнить следующий запрос, чтобы получить информацию о столбцах таблицы "users":
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' ORDER BY ORDINAL_POSITION;
Этот запрос вернет названия столбцов таблицы "users" в порядке их расположения.
3. Использование инструментов управления базами данных, таких как SQL Server Management Studio (SSMS). В SSMS можно открыть диаграмму таблицы и посмотреть порядок столбцов визуально.
4. Просмотр структуры таблицы в схеме базы данных. В схеме базы данных можно найти информацию о порядке столбцов таблицы.
Используя вышеперечисленные методы, вы сможете понять порядок столбцов в таблице в SQL (MS SQL) и работать с ними эффективно.