Таблица обновления T-SQL, использующая текущие столбцы в качестве входных параметров функции - PullRequest
0 голосов
/ 11 февраля 2012

Я пытаюсь обновить столбцы таблицы с помощью функции. Входными параметрами функции являются поля данных из таблицы, которые я хочу обновить.

Допустим, у меня есть таблица с двумя столбцами ("Страна" и "Столица"). «Столица» введена, и я использую функцию, которая возвращает название округа по имени столицы в качестве входного параметра. Итак, мой код обновления выглядит примерно так:

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

Нет ошибки, сгенерированной IntelliSence, но на F5 нажмите: 1006 *

Неверный синтаксис рядом с «Столицей».

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

Заранее спасибо за помощь. Джоро

Возможное решение:

Я нашел другой способ сделать это. Выглядит не очень хорошо, но работает:

  • Я добавил индекс в свою временную таблицу, чтобы использовать оператор while
  • Для каждой записи в таблице (используя оператор while) я использовал временные переменные для хранения необходимой мне информации о поле
  • Затем я передал эту информацию своим функциям и результатам, которые я использовал для обновления таблицы

Я предполагаю, что скобки '()', которые окружали оператор select и функцию, не позволяли функции использовать правильные значения из таблицы.

1 Ответ

0 голосов
/ 11 февраля 2012

узнать правильный (наиболее эффективный) способ построения SQL :

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

вы не можете кодировать SQL как прикладную программу, вам нужно использовать логику установки, а НЕ логику для каждой строки. Когда вы добавляете несколько функций в оператор SQL, их , скорее всего, нужно будет запускать для каждой строки, что замедляет ваши запросы (если они не являются табличными функциями в предложении FROM). Если просто включить функцию в запрос, вы можете , скорее всего, увидеть значительное улучшение производительности из-за использования индекса и операций, выполняемых по полной, а не по строке в строке.

грустно иметь очень sql-код, который не элегантен и часто повторяется повсюду. тем не менее, ваша главная цель - быстрый поиск данных (использование индекса и операции над множествами), а не какой-нибудь изящный конкурс красоты кодирования.

I have found other way to do this. yuck yuck yuck, звучит как будущий вопрос здесь, на SO, когда следующий человек должен будет поддерживать этот код. Вам не нужен индекс для использования WHILE. Если в вашей временной таблице столько строк, что вам нужен индекс, то WHILE - это то, что LAST , что вам следует делать!

...