【发布时间】:2016-04-05 12:40:39
【问题描述】:
我有三个表Table1、Table2、Table3。我在 Table1-> Tier1、Tier2 和 Flag 中有三列 may or may not be null 。我将根据公共列和updating 这三列加入这些表。
我的代码如下:
ALTER PROCEDURE [dbo].[SpUpdateTable]
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION;
BEGIN TRY
UPDATE Table1
SET Tier_1 = tbl3.T1, Modify_Date = SYSDATETIME()
FROM Table1 tbl1
JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1
JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2
WHERE tbl1.BrandName = 'Dell' AND
(tbl3.T1 IS NOT NULL AND tbl1.Tier_1 IS NULL OR tbl1.Tier_1 <> tbl3.T1);
UPDATE Table1
SET Tier_2 = tbl3.T2, Modify_Date = SYSDATETIME()
FROM Table1 tbl1
JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1
JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2
WHERE tbl1.BrandName = 'Dell' AND
(tbl3.T2 IS NOT NULL AND tbl1.Tier_2 IS NULL OR tbl1.Tier_2 <> tbl3.T2);
UPDATE Table1
SET Flag = tbl3.Flag, Modify_Date = SYSDATETIME()
FROM Table1 tbl1
JOIN Table2 tbl2 ON tbl1.CommonColumn1 = tbl2.CommonColumn1
JOIN Table3 tbl3 ON tbl2.CommonColumn2 = tbl3.CommonColumn2
WHERE tbl1.BrandName = 'Dell' AND
(tbl3.Flag IS NOT NULL AND tbl1.Flag IS NULL OR tbl1.Flag <> tbl3.Flag);
END TRY
BEGIN CATCH
IF @@TRANSCOUNT > 0
ROLLBACK TRANSACTION;
RETURN;
END CATCH
IF @@TRANSCOUNT > 0
COMMIT TRANSACTION;
END
好吧,我的代码正在一一更新列。我更关心hitting database 更新每一列,有什么方法可以使用单个更新查询来做到这一点?
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@marc_s :感谢您提供此信息,已更正此问题。但这只是为了命名。我已经更改了无法直接粘贴到此处的实际代码。
-
并不是说它会帮助你的表现,但你可能会得到更有建设性的答案:几乎不可能一眼就知道发生了什么,感觉太像工作了。是否可以通过
Table3为Table1提供更有意义的名称?试着忘记你刚刚写的,并阅读你的where子句重复tblx.Flag条件。
标签: sql-server join stored-procedures exception-handling sql-update