2012-02-11 68 views
0

我正尝试使用函数更新表列。函数的输入参数是我想要更新的表中的数据字段。使用当前列作为函数的输入参数的T-SQL更新表

比方说,我有两列(“国家”和“资本”)表。输入“Capital”,我使用一个按大写字母作为输入参数返回县名的函数。所以,我更新的代码是这样的:

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

没有通过IntelliSence产生的错误,但F5按它说:

附近有语法错误“资本”。

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

非常感谢您的帮助。 Joro

可能的解决方案:

我已经找到其他的方式来做到这一点。它看起来并不那么好,但它的工作原理:

  • 我已经为了while语句
  • 使用对于每个记录在表中我的临时表中添加索引(使用while语句),我已经使用临时变量存储我都需要
  • 然后,我已经过了这个信息,我的职能领域的信息,我已经习惯了更新表的结果

我的猜测是,括号“()”包围着的选择声明和函数不允许该函数使用正确的val来自桌上的你。

+0

资本应该是参数。你想用你的函数的返回值更新Country country的所有行吗? – 2012-02-11 09:57:43

+0

是的,我知道: - ]。我已经写下了其余的功能。如果你这样做 更新表名称 设置Field1 = Field2 它的工作原理。那么,为什么我不能将Field2传递给我的函数呢? – gotqn 2012-02-11 10:00:19

+0

你是否通过资本作为参数,对吗?如果是这样,应该参数@Capital? – 2012-02-11 10:10:35

回答

0

学习的正确方法(最有效的)来构建SQL:你不能像一个应用程序的SQL代码,你需要使用每行逻辑组逻辑和NOT

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

。当你将一堆函数放入一条SQL语句中时,它们很可能需要每行运行,这会减慢查询速度(除非它们是FROM子句中的表函数)。如果只是将函数合并到查询中,您可以最有可能看到大规模的性能改进,因为索引的使用和操作发生在完整的而不是每行的行上。

很遗憾,必须非常优雅的sql代码,并且经常在整个地方重演自己。然而,你的主要sql目标是快速数据检索(索引使用和设置操作),而不是一些花哨的编码选美比赛。

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

+0

这是什么人?你认为如果有办法不使用函数,但更新与INNER JOIN我不会这样做?你是否阅读我的文章,并了解我是什么情况? 更重要的是,我不想在这里表现。如果数据我应该修改,更新等,但是只有一次,我有很大的数量。结果将是一个普通的表格。我正在对数据进行一次操纵... – gotqn 2012-02-11 11:02:28

+0

我错过了你的问题,你说这是“一次”运行。我重读了你的问题,但仍然没有看到你说过这是一次运行。你说'你认为如果有办法不使用函数,但使用INNER JOIN更新,我不会这么做吗?'但是你发布了一个关于'错误语法附近...'错误的问题。我想,如果你不能阅读手册,那么你不会很熟悉SQL。我想我的坏。无论如何,如果这是一次运行,那么如果你有足够的时间运行,循环就没有问题。 – yyyy 2012-02-11 11:53:34

+0

这一次运行,我仍然更喜欢尽可能多的基于集合的处理,尝试使用临时表来保存中间值,在这种情况下'OUTPUT'可以非常有帮助。 – yyyy 2012-02-11 11:55:29