2014-07-05 3 views
-2

У меня есть временная таблица A, имеющая 2 столбца col1: ID col2: значение, сгенерированное с использованием XML. Мне нужно обновить столбцы в таблице B, соответствующие столбцу1: идентификатор таблицы A со значениями, присутствующими в col2: значение таблицы A. ПРИМЕЧАНИЕ. Необходимо обновлять только определенные столбцы и не все в таблице B.обновление значений в одной таблице из другой таблицы с использованием DYNAMIC SQL в MSSQL

таблица A

+----+-------+ 
| ID | Value | 
+----+-------+ 
| 1 | 533 | 
| 5 | 34 | 
| 6 | 56 | 
+----+-------+ 

таблицу В

+-----+---+---+---+----+----+---+ 
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
+-----+---+---+---+----+----+---+ 
| 533 | | | | 34 | 56 | | 
+-----+---+---+---+----+----+---+ 

declare dynsql varchar(4000) = ' update table B set....... ' 
+1

Зачем вам нужен динамический SQL? Кроме того, таблица B содержит только одну строку? Если нет, то откуда вы знаете, какую строку обновить? –

+0

Аналогично тому, что сказал @Martin Smith, содержит ли таблица A только один набор значений? Если нет, то как вы знаете, какой набор значений таблицы A обновляет [какая строка] таблицы B? –

+0

Мартин, таблица B всегда будет содержать одну строку с примерно 140 столбцами, из которых должны быть обновлены только те столбцы, имя которых совпадает с идентификатором в таблице A. – user3758593

ответ

0

Попробуйте следующий запрос:

UPDATE TableB 
SET [1] = ISNULL(z.[1],TableB.[1]), 
    [2] = ISNULL(z.[2],TableB.[2]), 
    [3] = ISNULL(z.[3],TableB.[3]), 
    [4] = ISNULL(z.[4],TableB.[4]), 
    [5] = ISNULL(z.[5],TableB.[5]), 
    [6] = ISNULL(z.[6],TableB.[6]), 
    [7] = ISNULL(z.[7],TableB.[7]) 
FROM (
    SELECT [1],[2],[3],[4],[5],[6],[7] 
    FROM (SELECT Id, Value 
      FROM TableA)AS p 
    PIVOT (MAX(Value) FOR Id IN([1],[2],[3],[4],[5],[6],[7]))AS pvt 
    )z 

EDIT

Для того, чтобы иметь динамическое использование сводную следующий запрос:

DECLARE @columns1 NVARCHAR(1000) = '', 
     @columns2 NVARCHAR(1000) = '', 
     @sql NVARCHAR(MAX) 

SELECT @Columns1 = STUFF((SELECT ',['+Value+'] = ISNULL(z.['+Value+'],TableB.['+Value+'])' 
         FROM (SELECT DISTINCT Value FROM TableA)z 
         FOR XML PATH('')),1,1,''), 
     @Columns2 = STUFF((SELECT ',['+Value+']' 
         FROM (SELECT DISTINCT Value FROM TableA)z 
         FOR XML PATH('')),1,1,'') 


SET @sql = 'Update TableB 
      Set '[email protected]+' 
      From ( 
        Select '+ @columns2+' 
        From (Select Id, Value From TableA) AS p 
        Pivot (MAX(Value) For Id IN ('[email protected]+')) AS Pvt 
      )z' 

EXECUTE(@sql) 
+0

Спасибо @mehdi. Однако при таком подходе вы устанавливаете значения в NULL. Кроме того, мне нужно сопоставить имена столбцов во время выполнения, а не жестко кодировать его. – user3758593

+0

Я редактирую свой пост. Если вы хотите использовать динамический поворот, просмотрите мое редактирование. –

+0

Отредактированный комментарий работает нормально. Спасибо @Mehdi! – user3758593

0
INSERT INTO tb 
SELECT [1],[2],[3],[4],[5],[6],[7] FROM 
(SELECT 
id,value 
    from ta)as p 
PIVOT 
(AVG(value) FOR id IN([1],[2],[3],[4],[5],[6],[7]) 
)as bah 

Fiddle

+0

Спасибо @ Mihai.I нужно сделать ОБНОВЛЕНИЕ. Логика не работает. – user3758593

Смежные вопросы