Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос для архивной таблицы. Одна строка с возможностью джоина на много таблиц.  [new]
mezzanine
Member

Откуда:
Сообщений: 157
Добрый вечер.

Есть архивная таблица, ее часть в @hist_table. Т.е. реализован вариант хранения архива в одной но универсальной таблице.
Хотелось бы написать такой запрос который по нужным ID будет со справочных таблиц подтягивать данные. В примере запроса хочу для таблицы 'TABLE1' и поля 'PERSON_ID' получить его имя. Но в моем варианте джоина получаю ошибку "Ошибка преобразования значения nvarchar "Text 1" в тип данных int.". Как бы его по другому написать?

DECLARE @hist_table TABLE (
  table_name NVARCHAR(100),
  column_name NVARCHAR(100),
  old_value NVARCHAR(4000),
  new_value NVARCHAR(4000)
);

DECLARE @pers_table TABLE (
  pers_id INT,
  pers_name NVARCHAR(100)
);

DECLARE @ord_table TABLE (
  ord_id INT,
  ord_name NVARCHAR(100)
);

INSERT INTO @hist_table
SELECT 'TABLE1', 'PERSON_ID', NULL, '100'
 UNION
SELECT 'TABLE1', 'COLUMN_TEXT', NULL, 'Text 1'
 UNION
SELECT 'TABLE2', 'ORDER_ID', NULL, '200'
 UNION
SELECT 'TABLE2', 'COLUMN_TEXT', NULL, 'Text 2';

INSERT INTO @pers_table
SELECT 100, 'John Do';

INSERT INTO @ord_table
SELECT 200, 'Order numer 200';

SELECT ht.table_name,
       ht.column_name,
       ht.old_value,
       ht.new_value,
       pt.pers_name
  FROM @hist_table ht
  LEFT JOIN @pers_table pt
    ON ht.table_name = 'TABLE1' AND ht.column_name = 'PERSON_ID' AND ht.new_value = pt.pers_id
  LEFT JOIN @ord_table ot
    ON ht.table_name = 'TABLE2' AND ht.column_name = 'ORDER_ID' AND ht.new_value = ot.ord_id
8 май 16, 23:21    [19148780]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для архивной таблицы. Одна строка с возможностью джоина на много таблиц.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
mezzanine
Но в моем варианте джоина получаю ошибку "Ошибка преобразования значения nvarchar "Text 1" в тип данных int.". Как бы его по другому написать?
Используйте CASE в условии джойна.
ON pt.pers_id = CASE WHEN ht.table_name = 'TABLE1' AND ht.column_name = 'PERSON_ID' THEN ht.new_value ELSE NULL END
8 май 16, 23:32    [19148812]     Ответить | Цитировать Сообщить модератору
 Re: Запрос для архивной таблицы. Одна строка с возможностью джоина на много таблиц.  [new]
mezzanine
Member

Откуда:
Сообщений: 157
alexeyvg,

Спасибо! То что нужно.
9 май 16, 11:36    [19149339]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить