2014-07-05 93 views
-2

我有一個臨時表A,它有兩列col1:ID col2:使用XML生成的值。我需要更新表B中與列1相對應的列:表A的值,其值存在於col2:表A的值中。注意:表B中只有特定列和不全部需要更新使用MSSQL中的DYNAMIC SQL從另一個表更新一個表中的值

表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

Martin,表B總是包含一行約140列,其中只有名稱與表A中的ID匹配的列需要更新。 – 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 

編輯

爲了擁有動態樞使用下面的查詢:

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

相關問題