Создайте переменную таблицы с точно такой же структурой другой таблицы - PullRequest
1 голос
/ 30 мая 2019

В T-SQL я могу создать табличную переменную, используя синтаксис, такой как

DECLARE @table AS TABLE (id INT, col VARCHAR(20))

На данный момент, если я хочу создать точную копию реальной таблицы в базе данных, я делаю что-то вроде этого

SELECT * 
FROM INFOMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'MY_TABLE_NAME'

, чтобы проверить тип данных столбца, а также максимальную длину и начать создавать переменную @table, поочередно называя переменную, тип данных и max_length, что не очень эффективно.Могу ли я узнать, есть ли какой-нибудь более простой способ сделать это, например,

DECLARE @table AS TABLE = SOME_REAL_TABLE_IN_DATABASE

Кроме того, есть ли способ получить имя столбца, тип данных и максимальную длину столбца и использовать его непосредственно в объявлении, как

DECLARE @table AS TABLE (@col1_specs)

Заранее спасибо.

РЕДАКТИРОВАТЬ: Спасибо за ответы и комментарии, мы можем сделать это для @table_variable, но только в динамическом SQL, и это не хорошо для удобства сопровождения.Однако мы можем сделать это, используя #temp_table.

Основываясь на ответе Ezlo, мы можем сделать что-то вроде этого:

SELECT TABLE.* INTO #TEMP_TABLE FROM TABLE

Для получения дополнительной информации, пожалуйста, обратитесь к этому ответу .

Разница между временной таблицей и табличной переменной (stackoverflow)

Разница между временной таблицей и табличной переменной (dba.stackexchange)

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Имена объектов и типы данных (таблицы, столбцы и т. Д.) Не могут быть параметризованы (не могут быть получены из переменных).Это означает, что вы не можете сделать следующее (например, для копирования структуры таблицы):

DECLARE @TableName VARCHAR(50) = 'Employees'

SELECT
    T.*
FROM
    @TableName AS T

Единственный обходной путь - использовать динамический SQL:

DECLARE @TableName VARCHAR(50) = 'Employees'

DECLARE @DynamicSQL VARCHAR(MAX) = '
    SELECT
        T.*
    FROM
        ' + QUOTENAME(@TableName) + ' AS T '

EXEC (@DynamicSQL)

Однако переменные (скалярные и табличные переменные), объявленные вне динамического SQL, не будут доступны внутри, поскольку они теряют область видимости:

DECLARE @VariableOutside INT = 10

DECLARE @DynamicSQL VARCHAR(MAX) = 'SELECT @VariableOutside AS ValueOfVariable'

EXEC (@DynamicSQL)

Msg 137, Level 15,Состояние 2, строка 1
Необходимо объявить скалярную переменную "@VariableOutside".

Это означает, что вам придется объявлять переменную внутри динамического SQL:

DECLARE @DynamicSQL VARCHAR(MAX) = 'DECLARE @VariableOutside INT = 10
                                    SELECT @VariableOutside AS ValueOfVariable'

EXEC (@DynamicSQL)

Результат:

ValueOfVariable
10

Что подводит меня к моему выводу: если вы хотите динамически создать копию существующей таблицы в качестве табличной переменной, весь доступ к вашей табличной переменной должен быть внутри динамическогоСценарий SQL, который очень труден и имеет некоторые недостатки (сложнее поддерживать и читать, более подвержен ошибкам и т. Д.).

Обычный подход - вместо этого работать с временными таблицами.Выполнение SELECT * INTO для их создания унаследует типы данных таблицы.Вы можете добавить всегда ложное WHERE условие (например, WHERE 1 = 0), если не хотите вставлять фактические строки.

IF OBJECT_ID('tempdb..#Copy') IS NOT NULL
    DROP TABLE #Copy

SELECT
    T.*
INTO
    #Copy
FROM
    YourTable AS T
WHERE
    1 = 0
1 голос
/ 30 мая 2019

Ответ на оба вопроса прост: НЕТ.

Хотя я согласен с вами, что T-SQL должен измениться таким образом.

В первом случае это означает наличие команды для клонирования структуры таблицы.

Конечно, есть возможность создать собственное расширение T-SQL с помощью SQLCLR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...