Я использую SQL Server. Мой вопрос: могу ли я создать временную таблицу без определения ее столбцов? или есть динамический способ создать временную таблицу из SELECT Column1, Column2 FROM DBO.TBLDATACOPY
?
Цель состоит в том, чтобы создать временную таблицу для хранения данных, возвращаемых , SELECT Column1, Column2 FROM DBO.TBLDATACOPY
который выполняется с использованием EXECUTE sp_executesql
. Я не могу сделать следующее, SELECT * INTO #TBCOPY FROM (SELECT *FROM DBO.TBLDATACOPY)
потому что таблица #TBCOPY
уничтожается в конце файла sp_executesql
.
Если вам просто нужно использовать SELECT INTO:
Запустите этот пример и скажите мне, если он будет близок к тому, что вам нужно, очевидно, что сделать его динамическим будет невозможно.
Есть довольно сложный способ сделать это на мой вкус, я вам объясню.
Обычно, когда мы хотим создать временную таблицу динамически, не определяя
CREATE
первую, мы делаем следующее:Невозможно сделать то же самое с результатом SP, мы можем сделать
INSERT INTO
, но ясно, что для этого мы должны знать структуру и создать таблицу в первую очередь. Альтернативой является передача выполнения SP через тотOPENROWSET
, который каким-то образом имитирует Таблицу с результатами, но для этого наш SQL Server должен иметь специальную конфигурацию, поэтому первым делом нужно перенастроить его так:Если у нас есть возможность поддерживать эту конфигурацию, мы можем сделать:
Очевидно, измените dsn соединения соответствующим образом, в этом примере мы используем встроенную безопасность, но пользователь/пароль можно настроить. У этого есть свои недостатки, dsn в открытом виде, накладные расходы на использование OPENROWSET и т. д. Если можно жить с этими недостатками, это может быть хорошей альтернативой.
Используете ли вы какую-либо SP (хранимую процедуру)? Если да, то используйте свой SELECT INTO условно, без начального # (Число) и он создаст таблицу, поработайте с ней сколько вам нужно, то есть удалит ее до окончания самого SP. Если нет, определите механизм для его удаления во время процесса, чтобы таблица не хранилась бесконечно.
Вы можете сделать это следующим образом:
Таким образом, вы можете определить столбцы, которые вы хотите иметь во временной таблице, то есть, если вы хотите, чтобы она содержала все столбцы физической таблицы или только некоторые определенные, вы также можете фильтровать данные, поскольку вы можете добавить ГДЕ в дополнение к объединению с другими таблицами
CTE может служить вам