我正在尝试通过一种方法在表上执行一些基于规则的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,因为 然后检查返回值和调试是一件痛苦的事。
另外,实际的#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。
答案 0 :(得分: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