Перемещение всех данных из одной созданной таблицы Dynami c в другую, за исключением некоторых столбцов - PullRequest
0 голосов
/ 06 марта 2020

Я динамически создаю две идентичные таблицы из JSON. Позволяет их вызывать Test1.Table , Test2.Table.

Test.Table1 затем загружается с данными в его столбцах кем-то другим.

Моя проблема в том, что теперь я хочу создать хранимую процедуру, которая создает хранимая процедура, которая берет все данные из Test.Table1 и вставляет их в Test.Table2, что было бы легко, за исключением того, что я не хочу брать все столбцы из Test.Table1, я хочу все, кроме 3, из них.

Я не могу сделать SELECT (col1, col2, col4, col5...etc) INTO Test.Table2 FROM Test.Table1, потому что столбцы являются динамическими c каждый раз, и таблица уже существует.

Я не могу использовать временную таблицу, чтобы переместить данные Test.Table1 в столбцы, которые мне не нужны, и вставить их в Test.Table2, поскольку столбцы не совпадают.

1 Ответ

0 голосов
/ 07 марта 2020

Вот быстрый скрипт для начала. Я создал две таблицы в базе данных tempdb со слегка отличающимися структурами таблиц и написал ее так, чтобы вы могли вставлять из первой во вторую, где совпадают столбцы. Вы можете изменить структуру таблицы, и запрос изменится соответственно. Запрос основан на второй таблице. Это часть дизайна, вы можете поменять это на sh.

Use tempdb;
Go

If OBJECT_ID ('tempdb..##Temp1') is not null Drop Table ##Temp1
If OBJECT_ID('tempdb..##Temp2') is not null Drop Table ##Temp2

Create Table ##Temp1 (col1 int, col2 int, col3 int, col4 int)
Create Table ##Temp2 (col1 int, col2 int, col4 int)

Declare @max int
Declare @sql nvarchar(max)

Select @max = max(ordinal_position)
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '##Temp2' 

Select @sql = 
STRING_AGG(
case when ordinal_position = 1 then 'Insert into ##Temp2 ('+COLUMN_NAME+',' 
when ORDINAL_POSITION = @max then COLUMN_NAME +')'
else COLUMN_NAME+', ' end,'') + string_agg (
case when ordinal_position = 1 then ' Select '+COLUMN_NAME+', ' when ORDINAL_POSITION = @max 
Then COLUMN_NAME +' From ##Temp1' else COLUMN_Name + ', ' end,'')
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = '##Temp2'

EXEC sp_executesql @sql

Надеюсь, это поможет.

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