T-SQL, обновление нескольких переменных за один выбор - PullRequest
43 голосов
/ 22 января 2009

Можно ли обновить более одной локальной переменной за один выбор?

Что-то вроде:

set
    @variableOne = avg(someColumn),
    @variableTwo = avg(otherColumn)
    from tblTable

Кажется немного расточительным сделать две отдельные операции выбора для чего-то столь же тривиального, как эта задача:

set @variableOne = ( select avg(someColumn) from tblTable )
set @variableTwo = ( select avg(otherColumn) from tblTable )

Ответы [ 3 ]

94 голосов
/ 22 января 2009

Примерно так:

select @var1 = avg(someColumn), @var2 = avg(otherColumn) 
from theTable
12 голосов
/ 22 января 2009

Вы можете использовать назначение SELECT для назначения нескольких переменных. Этот код генерирует одну строку констант и присваивает их каждой переменной.

SELECT
  @var1 = 1,
  @var2 = 'Zeus'

Вы даже можете запрашивать таблицы и делать назначения таким образом:

SELECT
  @var1 = c.Column1,
  @var2 = c.Column2,
FROM
  Customers c
WHERE c.CustomerID = @CustomerID

Осторожно: этот код работает как цикл while.

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

Предпочитают использовать назначение SET вместо назначения SELECT. Используйте назначение SELECT только при рассмотрении обоих вышеописанных сценариев.

1 голос
/ 22 января 2009

как насчет

SELECT  @variableOne = avg(someColumn),  @variableTwo = avg(otherColumn) from tblTable 

у меня это прекрасно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...