【问题标题】:How can I update a record using a correlated subquery?如何使用相关子查询更新记录?
【发布时间】:2011-02-21 09:07:07
【问题描述】:

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

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 '('.

【问题讨论】:

  • 那个功能码也可以加吗?

标签: sql sql-update correlated-subquery


【解决方案1】:

我从来没有做过这样的事情,所以....我看到的所有代码都在函数名上使用了一个模式——比如:

FROM dbo.fn_doSomething(myOtherField)

【讨论】:

  • +1。如果是 SQL Server,则 UDF 名称必须以架构名称为前缀。并且默认通常是dbo
  • 感谢您的建议,但这只是一个示例查询 - 在我的实际查询中,该函数是完全限定的。
【解决方案2】:

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

尝试在 Server 2005 中使用 CROSS APPLY 或 OUTER APPLY 加入表值函数

也试试这个,大师 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 嗯,这可能是我的问题......可能该字段是一个整数字段,但该函数期望它作为一个字符串。让我试试这个……
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多