2010-09-28 44 views
3

我想调用一个“更新”存储过程,它不一定包含所有列。 可能有更好的方法来处理这个问题.... 正如你所看到的,如果我不传递列参数,它们的值是NULL。然后,使用ISNULL将列设置为新值或现有值。当我更新自己的SQL列时会发生什么? - 或者 - 简化的条件更新?

CREATE PROCEDURE [dbo].[spUpdateTable] 

@pPKID bigint = NULL, 
@pColumn1 int = NULL, 
@pColumn2 int = NULL 

AS 
BEGIN 

SET NOCOUNT ON; 

UPDATE 
    TableName 
SET 
    [Column1] = ISNULL(@pColumn1,[Column1]), 
    [Column2] = ISNULL(@pColumn2,[Column2]) 

WHERE 
    [PKID] = @pPKID 
END 
+0

我知道在数据库中会发生什么,我的意思是有没有任何性能问题或更好的方法来做到这一点? – Matthew 2010-09-28 19:52:50

回答

2

这与事务复制存储过程在订户上更新表时所做的基本相同。如果微软自己做,它一定是安全的,对吧? :-)

说真的,我最关心的是任何可能存在于表上的更新触发器。您想了解可能触发这些触发器对可能不会发生变化的影响。否则,我认为你的技术很好。

+0

提醒您更新触发器。虽然我故意没有在这个数据库中使用任何东西,但我可以肯定地看到,这是其他项目中某些表格的障碍。在更新触发器确实存在的情况下,您是否有其他方法的建议?此外,我是否应该关注复制数据库中的这种触发器? – Matthew 2010-09-28 20:11:14

+0

如果您需要替代方案,您可以测试每个参数并将更新语句构建为您将作为动态SQL执行的字符串。这里是[动态SQL的诅咒和祝福](http://www.sommarskog.se/dynamic_sql.html)的必要链接。至于复制数据库中的触发器,这可能是一个单独的讨论。举一个简单的例子,如果你复制表A和B,并且A有一个插入到B中的触发器,你当然希望禁用订阅者的同一个触发器。 – 2010-09-28 20:21:49

+0

非常有意义。我之前多次阅读过动态SQL的这一点(并且我希望尽可能避免动态SQL) – Matthew 2010-09-28 20:36:23

相关问题