Найти индекс столбца по его имени - PullRequest
0 голосов
/ 24 февраля 2020

Если у меня есть три столбца: syscode, loc_cod, loc_name, но я хотел бы знать, был ли loc_name третьим по порядку. Как я могу получить это с помощью SQL запроса?

Ответы [ 5 ]

1 голос
/ 24 февраля 2020
  • Решения с INFORMATION_SCHEMA имеют целевую таблицу или таблицу.
  • Решения с ...describe_first_result_set должны передавать SELECT в виде строки, это может быть откат (динамическое выполнение c).

Итак, есть одно решение используя универсальные c способности XQuery:

Мы используем SELECT TOP 1 * FROM ..., чтобы получить XML -результат из одной строки. Для демонстрации я использую sys.objects здесь:

DECLARE @YourSelect XML=
(
    SELECT TOP 1 * 
    FROM sys.objects o
    FOR XML PATH('')
);

- Это запрос:

WITH tally(Nr) AS(SELECT TOP(@YourSelect.value('count(/*)','int')) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values)
SELECT Nr
      ,@YourSelect.value('local-name((*[sql:column("Nr")])[1])','nvarchar(max)')
FROM tally;

Идея вкратце:

  • Мы используем tally-on-the-fly с вычисленным предложением TOP(), чтобы получить текущий список чисел. Вычисленный TOP уменьшит этот список до фактического количества столбцов.
  • Мы используем XQuery local-name() и подстановочный XPath с *, чтобы получить каждый элемент по его позиции.

Результатом является нумерованный список имен столбцов.

Nr  column_name
1   name
2   object_id
3   schema_id
4   parent_object_id
5   type
6   type_desc
7   create_date
8   modify_date
9   is_ms_shipped
10  is_published
11  is_schema_published

Подсказка:

  • Вы можете добавить предложение WHERE для фильтрации по данному имени столбца
  • Это может быть полностью встроено, если необходимо ...
1 голос
/ 24 февраля 2020

Вы можете попробовать с information_schema.columns, как показано ниже.

Select 
     * 
from information_schema.columns
where table_name = 'TableA'

Вот живое db <> fiddle демо.

Вы также можете попробовать ниже.

Select 
     Column_Name
     , ORDINAL_POSITION
from information_schema.columns
where table_name = 'TableA'

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

Select 
     * 
from information_schema.columns
where table_name = 'TableA' and COLUMN_NAME = 'Code2'
1 голос
/ 24 февраля 2020

У вас есть sp_column в t- sql. Одним из элементов, возвращаемых в наборе результатов, является ORDINAL_POSITION - "Порядковый номер столбца в объекте. Первый столбец в объекте равен 1. Этот столбец всегда возвращает значение."

Использование:

exec sp_columns MyTable
1 голос
/ 24 февраля 2020

Если вы хотите, чтобы столбец имел порядковый номер, имя и тип от Query или даже Stored Procedure

Select column_ordinal
      ,name
      ,system_type_name 
  From sys.dm_exec_describe_first_result_set('Select * from OD',null,null )  
1 голос
/ 24 февраля 2020

Вы можете использовать information_schema:

select col.table_name, col.column_name, 
       (case when col.ordinal_position = 3 then 'Yes' else 'No' end) as Position_flag
from INFORMATION_SCHEMA.COLUMNS as col
where col.table_name = <whatever> and col.column_name = 'loc_name';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...