如何使用相关子查询更新记录?

时间:2011-02-21 09:07:07

标签: sql sql-update correlated-subquery

我有一个函数接受一个参数并返回一个表/结果集。我想在表中将字段设置为该记录集的第一个结果,并将表的其他字段之一作为参数传入。如果单词太复杂,查询看起来像这样:

UPDATE myTable
SET myField = (SELECT TOP 1 myFunctionField
        FROM fn_doSomething(myOtherField)
        WHERE someCondition = 'something')
WHERE someOtherCondition = 'somethingElse'

在此示例中,myFieldmyOtherFieldmyTable中的字段,myFunctionFieldfn_doSomething返回的字段。这对我来说似乎合乎逻辑,但我收到了以下奇怪的错误:

'myOtherField' is not a recognized OPTIMIZER LOCK HINTS option.

知道我做错了什么,以及我如何做到这一点?

更新

根据Anil Soman的回答,我意识到该函数期望一个字符串参数,并且传递的字段是一个整数。我不确定这是否应该是一个问题,因为使用整数值显式调用函数是有效的 - 例如fn_doSomething(12345)似乎自动将数字转换为字符串。但是,我尝试做一个明确的演员:

UPDATE myTable
SET myField = (SELECT TOP 1 myFunctionField
        FROM fn_doSomething(CAST(myOtherField AS varchar(1000)))
        WHERE someCondition = 'something')
WHERE someOtherCondition = 'somethingElse'

现在我收到以下错误:

Line 5: Incorrect syntax near '('.

4 个答案:

答案 0 :(得分:1)

我从来没有做过这样的事情......所以我看到的所有代码都在函数名称上使用了一个模式 - 所以类似于:

FROM dbo.fn_doSomething(myOtherField)

答案 1 :(得分:1)

似乎是SQL 2000中的编译器错误

尝试在Server 2005中使用CROSS APPLY或OUTER APPLY

加入表值函数

也试试这个,guru huys

CREATE FUNCTION FCN_pruebaChicaBorrame(@numerito int)
RETURNS @returnTable TABLE (numerito int)
AS
BEGIN
    insert into @returnTable values(@numerito)
    return
END

Select * from FCN_pruebaChicaBorrame(20)

Select col_1
    from (  select 1 as col_1
        union   select 2
        union   select 3) as tablita

Select col_1, (select * from dbo.FCN_pruebaChicaBorrame(20) as fcnTable)
    from (  select 1 as col_1
        union   select 2
        union   select 3) as tablita

Select col_1, (select * from dbo.FCN_pruebaChicaBorrame(col_1) as fcnTable)
    from (  select 1 as col_1
        union   select 2
        union   select 3) as tablita

Select col_1, (select * from dbo.FCN_pruebaChicaBorrame(case when 1=1 then 20 else 21) as fcnTable)
    from (  select 1 as col_1
        union   select 2
        union   select 3) as tablita

答案 2 :(得分:0)

我在谷歌搜索此错误,一个人谈到搜索条件中缺少单引号。您的功能代码是这种情况吗? link to related blog

答案 3 :(得分:0)

似乎(至少在SQL Server 2000中)您无法将列值传递给表值函数。我不得不设置一个标量函数来解决这个问题。