我有一个函数接受一个参数并返回一个表/结果集。我想在表中将字段设置为该记录集的第一个结果,并将表的其他字段之一作为参数传入。如果单词太复杂,查询看起来像这样:
UPDATE myTable
SET myField = (SELECT TOP 1 myFunctionField
FROM fn_doSomething(myOtherField)
WHERE someCondition = 'something')
WHERE someOtherCondition = 'somethingElse'
在此示例中,myField
和myOtherField
是myTable
中的字段,myFunctionField
是fn_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 '('.
答案 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中)您无法将列值传递给表值函数。我不得不设置一个标量函数来解决这个问题。