【问题标题】:SQL Update Dynamic Based on Table?基于表的 SQL 更新动态?
【发布时间】:2011-11-09 21:47:59
【问题描述】:

我正在尝试通过一种方法来对表执行一些基于规则的 SQL 更新语句。 情况如下所示,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,因为 然后检查返回值和调试很痛苦。

另外,实际的#thetable 有 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。

【问题讨论】:

  • 进行此类处理的最佳方法是在事务 sql 过程中。 1) 从#dynamicstuff 中读取每一行。 2) 在#thetable 上发布更新声明
  • 你能说得更具体点吗?使用存储过程是显而易见的。读取每一行意味着一个游标。当我不知道要触摸哪一列时发布更新意味着动态代码,对吗?你到底在说什么?

标签: sql-server-2008 dynamic pivot sql-update rule-engine


【解决方案1】:

我认为如果没有动态 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多