Хранилища хранимых процедур SQL Server хранят 2 переменные таблицы в 1 таблице с значениями от и до значений

У меня есть эта таблица, хранящаяся в переменных @oldValues и @newValues :

введите описание изображения здесь

Две приведенные выше таблицы будут содержать максимум 1 ряд. Моя цель – вставить это в новую таблицу JSON TABLE:

 DECLARE @jsonTable TABLE ( [Field] nvarchar(max), [From] nvarchar(max), [To] nvarchar(max) ); 

и сохраните значение from в значениях из старой и новой переменной

Вывод должен быть таким:

 [Field] [From] [To] // this is a column name ------------------------------------ CommitteeID 1 1 CommitteeName Test Test2 CommitteeMemberID 1 3 

Как я могу это достичь?

заранее спасибо

Это может быть просто

 select 'CommitteeId' [Field], (select cast(CommitteeId as varchar(max)) from @oldValues) [From], (select cast(CommitteeId as varchar(max)) from @newValues)[To] union all select 'CommitteeName', (select CommitteeName from @oldValues), (select CommitteeName from @newValues) union all select 'CommitteeId', (select cast(CommitteeMemberId as varchar(max)) from @oldValues), (select cast(CommitteeMemberId as varchar(max)) from @newValues) 

Если у вас есть только одна строка:

 select v.* from @oldValues ov cross join @newValues nv outer apply (values ('CommitteeId', ov.CommitteeId, nv.CommitteeId), ('CommitteeName', ov.CommitteeName, nv.CommitteeName), ('CommitteeMemberID', ov.CommitteeMemberID, nv.CommitteeMemberID) ) v(field, [from], [to]); 

Примечание. Это предполагает, что типы значений являются совместимыми. В противном случае вам может потребоваться преобразовать / передать значения в строки.

РЕДАКТИРОВАТЬ:

Чтобы быть явным, броски:

 select v.* from @oldValues ov cross join @newValues nv outer apply (values ('CommitteeId', cast(ov.CommitteeId as nvarchar(255)), cast(nv.CommitteeId as nvarchar(255))), ('CommitteeName', cast(ov.CommitteeName as nvarchar(255)), cast(nv.CommitteeName as nvarchar(255))), ('CommitteeMemberID', cast(ov.CommitteeMemberID as nvarchar(255)), cast(nv.CommitteeMemberID as nvarchar(255))) ) v(field, [from], [to]); 

Я думаю, что оператор UNPIVOT является самым правильным решением для этой необходимости.

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

 DECLARE @oldValues as TABLE (CommitteeID INT, CommitteeName VARCHAR(20), CommitteeMemberID INT) INSERT INTO @oldValues VALUES (1,'Test',1) DECLARE @newValues as TABLE (CommitteeID INT, CommitteeName VARCHAR(20), CommitteeMemberID INT) INSERT INTO @newValues VALUES (1,'Test2',3) DECLARE @jsonTable TABLE ( [Field] nvarchar(max), [From] nvarchar(max), [To] nvarchar(max) ); ;WITH FromTable AS ( SELECT [Field] , [From] FROM (SELECT CAST(CommitteeID AS VARCHAR(255)) CommitteeID, CAST(CommitteeName AS VARCHAR(255)) CommitteeName, CAST(CommitteeMemberID AS VARCHAR(255)) CommitteeMemberID FROM @oldValues) p UNPIVOT ( [From] FOR [Field] IN ( CommitteeID , CommitteeName , CommitteeMemberID)) as UNPVT ) , ToTable AS ( SELECT [Field] , [To] FROM (SELECT CAST(CommitteeID AS VARCHAR(255)) CommitteeID, CAST(CommitteeName AS VARCHAR(255)) CommitteeName, CAST(CommitteeMemberID AS VARCHAR(255)) CommitteeMemberID FROM @newValues) p UNPIVOT ( [To] FOR [Field] IN ( CommitteeID , CommitteeName , CommitteeMemberID)) as UNPVT ) SELECT F.*, T.[To] FROM FromTable F FULL JOIN ToTable T ON F.[Field] = T.[Field] 

Новые столбцы можно легко добавить в SELECT и IN часть запроса.

Для легкого определения недостающего столбца я использовал FULL JOIN

Interesting Posts

Возвратите все группы, у которых есть точно такие же сотрудники

Функция генерации инкрементирующих чисел в SQL Server

Как написать SQL, чтобы каскадно накапливать строки данных?

Функция Getdate () возвращает частичный день в выбранном запросе

Не удается подключиться к базе данных с помощью localhost \ sqlserver

SQL: левое внешнее соединение с условиями

Как улучшить код хранимой процедуры с внутренним соединением с возможным пустым tvp

преобразование по горизонтали и вертикали в SQL Server 2005

Должен ли первичный ключ, являющийся хешем, храниться как BINARY или CHAR (в шестнадцатеричном формате)?

Анализ и импорт XML в таблицу в SQL Server

Вопрос T-SQL Count

Вызов хранимой процедуры в EF со сложным типом данных

Как с правильным значением с подстановочным процентом

Не удалось загрузить файл или сборку «EntityFramework.SqlServer, Version = 6.0.0.0

Получить идентификатор строки, имеющей максимальное значение в другом столбце

Давайте будем гением компьютера.