0

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

假设我有两列(“国家”和“资本”)的表格。输入了“首都”,我正在使用一个函数,该函数通过首都名称返回县名作为输入参数。所以,我的更新代码是这样的:

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

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

“大写”附近的语法不正确。

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

预先感谢您的帮助。城郎

可能的解决方案:

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

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

我的猜测是,围绕 select 语句和函数的括号“()”不允许函数使用表中的正确值。

4

1 回答 1

0

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

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

您不能像应用程序一样编写 SQL,您需要使用集合逻辑而不是每行逻辑。当您将一堆函数放入 SQL 语句中时,它们很可能需要按行运行,从而减慢查询速度(除非它们是 FROM 子句中的表函数)。如果只是将函数合并到查询中,您很可能会看到性能大幅提升,因为索引使用和操作发生在完整的而不是每行的行上。

不得不使用非常不优雅且经常在各处重复的 sql 代码是很可悲的。但是,您的主要 sql 目标是快速数据检索(索引使用和集合操作),而不是一些花哨的编码选美比赛。

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

于 2012-02-11T10:44:35.823 回答