2011-11-09 51 views
1

我想通過一種方法來在表上執行一些基於規則的SQL更新語句。 事情看起來像下面,這IMO是不是真的最佳:基於表的SQL更新動態?

create table #typeofchange (TypeOfChangeId Int , ChangeNote VarChar(16)) 
Insert into #typeofchange values (0 , 'prepend') 
Insert into #typeofchange values (1 , 'replace') 
Insert into #typeofchange values (2 , 'append') 
create table #dynamicstuff (DynColName VarChar(16) , RowValue VarChar(16) , TypeOfChangeId Int) 
Insert into #dynamicstuff values ('Column_A' , 'xxxx' , 0) 
Insert into #dynamicstuff values ('Column_B' , 'yyyy' , 1) 
Insert into #dynamicstuff values ('Column_C' , 'zzzz' , 2) 
create table #thetable (Column_A VarChar(50) , Column_B VarChar(50) , Column_C VarChar(50)) 
insert into #thetable values ('-1-' , '-2-' , '-3-') 
insert into #thetable values ('-4-' , '-5-' , '-6-') 
insert into #thetable values ('-7-' , '-8-' , '-9-') 

--  Dynamic transform to get this result set -- 
--  Column_A Column_B Column_C 
--  xxxx-1-  yyyy  -3-zzzz 
--  xxxx-4-  yyyy  -6-zzzz 
--  xxxx-7-  yyyy  -9-zzzz 
------------------------------------------------ 

表圖式不必是這個樣子。但我需要找出一種方法來根據規則對#thetable執行更新 聲明。我寧願不必動態SQL,因爲 然後檢查返回值和調試是一個痛苦。

另外,實際的#thetable有144列,並且可以增長,所以case case語句會成爲我想的問題。

我想過改變#dynamicstuff到這一點,但我認爲它仍然走我變成了一個動態的SQL陷阱:

create table #dynamic2 (Column_A VarChar(50) , Column_B VarChar(50) , Column_C VarChar(50) , TypeOfChangeId , RowValue) 
insert into #dynamic2 values ('dothis' , null , null , 0 , 'xxxx') 
insert into #dynamic2 values (null , 'dothis' , null , 1 , 'yyyy') 
insert into #dynamic2 values (null , null , 'dothis' , 2 , 'zzzz') 

感謝所有的想法。

編輯

我想,如果我放棄#dynamic,並作出新的表名爲#dynamic2,也許我可以做這項工作。這裏是我的表現:

create table #typeofchange (TypeOfChangeId Int , ChangeNote VarChar(16)) 
Insert into #typeofchange values (0 , 'prepend') 
Insert into #typeofchange values (1 , 'replace') 
Insert into #typeofchange values (2 , 'append') 
create table #dynamicstuff2 (Column_A VarChar(50) , Column_B VarChar(50) , Column_C VarChar(50) , TypeOfChangeId Int) 
insert into #dynamicstuff2 values ('xxxx' , null , null , 0) 
insert into #dynamicstuff2 values (null , 'yyyy', null , 1) 
insert into #dynamicstuff2 values (null , null , 'zzzz' , 2) 
create table #thetable (Column_A VarChar(50) , Column_B VarChar(50) , Column_C VarChar(50)) 
insert into #thetable values ('-1-' , '-2-' , '-3-') 
insert into #thetable values ('-4-' , '-5-' , '-6-') 
insert into #thetable values ('-7-' , '-8-' , '-9-') 

我在想,我能以某種方式使一個聯盟愨#thetable和#dynamic2在一個單一的結果集得到的一切,然後更新表中的,但我覺得我還是卡住與動態SQL。

+0

的最佳方式做這樣的處理是在一個transact sql過程中。 1)從'#dynamicstuff'讀取每一行。 2)在'#thetable'發佈更新聲明 – Raihan

+0

你能更具體嗎?使用sproc是顯而易見的。讀取每一行意味着一個遊標。當我不知道要觸摸哪一列時,發佈更新意味着動態代碼,對吧?你到底在說什麼? – Snowy

回答

1

我不認爲你將能夠做到這一點沒有動態SQL。但是,如果你可以改變的#thetable的結構和它UNPIVOT這樣:

CREATE TABLE #thetableunpivoted 
(
    [RowId] INT, 
    [ColumnName] VARCHAR(50), 
    [Value] VARCHAR(50) 
) 

INSERT #thetableunpivoted 
VALUES (1, 'Column_A', '-1-'), 
     (2, 'Column_A', '-4-'), 
     (3, 'Column_A', '-7-'), 
     (1, 'Column_B', '-2-'), 
     (2, 'Column_B', '-5-'), 
     (3, 'Column_B', '-8-'), 
     (1, 'Column_C', '-3-'), 
     (2, 'Column_C', '-6-'), 
     (3, 'Column_C', '-9-') 

那麼你可以使用這樣的查詢:

UPDATE t 
SET [Value] = CASE toc.[ChangeNote] 
       WHEN 'prepend' THEN 
        ds.[RowValue] + t.[Value] 
       WHEN 'replace' THEN 
        ds.[RowValue] 
       WHEN 'append' THEN 
        t.[Value] + ds.[RowValue] 
      END 
FROM #thetableunpivoted t 
INNER JOIN #dynamicstuff ds 
    ON ds.[DynColName] = t.[ColumnName] 
INNER JOIN #typeofchange toc 
    ON toc.[TypeOfChangeId] = ds.[TypeOfChangeId] 

這給:

SELECT * 
FROM #thetableunpivoted 

RowId ColumnName Value 
1  Column_A xxxx-1- 
2  Column_A xxxx-4- 
3  Column_A xxxx-7- 
1  Column_B yyyy 
2  Column_B yyyy 
3  Column_B yyyy 
1  Column_C -3-zzzz 
2  Column_C -6-zzzz 
3  Column_C -9-zzzz