T-SQL Update Table使用当前列作为函数的输入参数

时间:2012-02-11 09:54:01

标签: sql-server tsql sql-server-2012

我正在尝试使用函数更新表列。该函数的输入参数是我想要更新的表中的数据字段。

假设我有两列的表(“国家”和“资本”)。输入“Capital”,我使用的函数返回按名称作为输入参数的县名。所以,我的更新代码是这样的:

UPDATE @TableName
SET Country=(SELECT Country FROM dbo.fn_GetCountryByCapital(Capital))

IntelliSence没有生成错误,但在F5上按下它说:

  

'Capital'附近的语法不正确。

请注意,这只是一个例子(因为它看起来很傻)。我给它样本以描述我的问题。我的实际情况包括在update语句中使用了几个函数。

提前感谢您的帮助。 Joro

可能的解决方案:

我找到了其他方法来做到这一点。它看起来不太好,但它确实有效:

  • 我在临时表中添加了索引,以便使用while语句
  • 对于表中的每条记录(使用while语句)我使用临时变量来存储我需要的字段信息
  • 然后我将此信息传递给我的函数以及我用来更新表的结果

我的猜测是,包含select语句和函数的括号'()'不允许函数使用表中的正确值。

1 个答案:

答案 0 :(得分:0)

学习构建SQL的正确方法(最有效)

UPDATE a
    SET Country=b.Country
    FROM @TableName a
    INNER JOIN YourCountryCapitalTable b ON a.Capital=b.Capital

你不能像应用程序那样编写SQL代码,你需要使用set logic和NOT per row logic。当您将一堆函数抛出到SQL语句中时,他们很可能将需要每行运行,从而减慢查询速度(除非它们是FROM子句中的表函数)。如果只是将函数合并到查询中,您可以最有可能看到大量的性能改进,因为索引使用和操作发生在完整而非每行的行上。

这是可悲不得不非常SQL代码,是不是优雅,往往会重演所有的地方。但是,你的主要目标是快速数据检索(索引使用和设置操作)而不是一些奇特的编码选美比赛。

I have found other way to do this. yuck yuck yuck,当下一个人需要维护此代码时,这听起来像是未来的问题。您不需要索引来使用WHILE。如果临时表中有这么多行需要索引,那么WHILE就是你应该做的最后事情!