Обновление SQL Динамическое на основе таблицы? - PullRequest
1 голос
/ 10 ноября 2011

Я пытаюсь найти способ сделать некоторые операторы SQL Update на основе правил для таблицы. Вещи выглядят как ниже, что IMO не совсем оптимально:

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, потому что тогда проверка возвращаемых значений и отладка - это боль.

Кроме того, фактическая таблица #the имеет 144 столбца и может расти, поэтому я думаю, что что-то с оператором 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.

1 Ответ

1 голос
/ 10 ноября 2011

Я не думаю, что вы сможете сделать это без динамического SQL. Однако, если бы вы могли изменить структуру #thetable и отключить ее следующим образом:

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
...