Как я могу обновить запись, используя коррелированный подзапрос? - PullRequest
0 голосов
/ 21 февраля 2011

У меня есть функция, которая принимает один параметр и возвращает таблицу / набор результатов. Я хочу установить поле в таблице на первый результат этого набора записей, передав в качестве параметра одно из других полей таблицы. Если это слишком сложно в словах, запрос выглядит примерно так:

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.

Есть идеи, что я делаю неправильно, и как я могу это сделать?

UPDATE

Основываясь на ответе Анила Сомана, я понял, что функция ожидает строковый параметр и передаваемое поле является целым числом. Я не уверен, должно ли это быть проблемой, поскольку работает явный вызов функции с использованием целочисленного значения - например, 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 ]

1 голос
/ 04 января 2012

похоже на ошибку компилятора в SQL 2000

попробуйте в Server 2005 и присоединитесь к табличной функции, используя CROSS APPLY или OUTER APPLY

и попробуй это, гуру хайс

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
1 голос
/ 21 февраля 2011

Я никогда не делал ничего подобного, поэтому .... весь код, который я видел, использует схему для имени функции - так что-то вроде:

ОТ dbo.fn_doSomething (myOtherField)

0 голосов
/ 22 февраля 2011

Кажется, что (по крайней мере, в SQL Server 2000) вы не можете передать значение столбца в табличную функцию.Мне пришлось настроить скалярную функцию, чтобы обойти это.

0 голосов
/ 21 февраля 2011

Я искал в Google эту ошибку, и один человек говорит об отсутствии одинарных кавычек в условии поиска.Так ли это с вашим кодом функции? ссылка на соответствующий блог

...