В sql server получить имена столбцов для таблицы без использования системных таблиц

Некоторое объяснение того, почему это может потребоваться и почему information_schema.columns / syscolumns / spcolumns не работают в моей ситуации:

У меня есть эта длинная процедура, которая поддерживает динамическую таблицу. Процедура сохраняет таблицу во временную таблицу, создает обновленную, используя SELECT INTO, и, наконец, INSERT помещает некоторые старые строки из временной таблицы во вновь созданную таблицу. Эта последняя часть выполняется путем поиска столбцов временной таблицы из системной таблицы и генерации динамического INSERT INTO sql с использованием курсора, перемещающегося по каждому столбцу.

Эти таблицы часто бывают очень большими, и SELECT INTO требует много времени, что приводит к блокировкам некоторых системных таблиц. В это время невозможно прочитать такие таблицы, как information_schema.columns и syscolumns. Поэтому, когда несколько таблиц обрабатываются одновременно, все они останавливаются до тех пор, пока блокировки не будут освобождены, потому что процедура в настоящее время пытается прочитать столбцы из таблицы information_schema.columns.

Ссылка, по которой исследуется проблема блокировки systables: https://www.sqlshack.com/sql-server-lock-issues-when-using-a-ddl-including-select-into-clause-in-long-running-transactions/

Есть идеи, как к этому подойти?

Как насчет использования подсказки nolock для этих таблиц? from information_schema.columns with (nolock) ...

a_horse_with_no_name 31.10.2018 14:16

В момент, когда SELECT INTO запускается, вы, очевидно, знаете все имена столбцов. Почему эта информация не попадает в сохранил в более позднюю часть с INSERT?

Damien_The_Unbeliever 31.10.2018 14:17

может быть, sp_describe_first_result_set поможет? Я не совсем уверен, что и когда возникает проблема.

Larnu 31.10.2018 14:53

Вы можете использовать set rowcount с select / into для создания выходной таблицы с одной строкой. Удалите эту строку и запустите запрос как insert / into, используя теперь пустую целевую таблицу. (Из документа: «SET ROWCOUNT прекращает обработку после указанного количества строк.»)

HABO 31.10.2018 15:15
stackoverflow.com/a/52925825/1080354
gotqn 01.11.2018 07:07

как насчет "exec sp_help tablename" ??

Eray Balkanli 02.11.2018 14:11
1
6
157
1

Ответы 1

Создавайте таблицы динамически, а не выбирайте в.

Например: Вместо того

SELECT name INTO #t FROM sys.objects;

Делать

CREATE TABLE #t (name SYSNAME);
INSERT INTO #t SELECT name FROM sys.objects;

Это может быть хороший комментарий, но в качестве ответа кажется, что ему не хватает содержания. Я решил не отмечать его как VLQ, но другие могут.

Zohar Peled 31.10.2018 14:25

Другие вопросы по теме