SQL Server 2005 Установка переменной в результат запроса select

Как установить переменную в результат запроса выбора без использования хранимой процедуры?


Я хочу сделать что-то вроде: OOdate DATETIME

SET OOdate = Select OO.Date FROM OLAP.OutageHours as OO WHERE OO.OutageID = 1 

Затем я хочу использовать OOdate в этом запросе:

 SELECT COUNT(FF.HALID) from Outages.FaultsInOutages as OFIO INNER join Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE CONVERT(VARCHAR(10),OO.Date,126) = CONVERT(VARCHAR(10),FF.FaultDate,126)) AND OFIO.OutageID = 1 

Вы можете использовать что-то вроде

 SET @cnt = (SELECT COUNT(*) FROM User) 

или

 SELECT @cnt = (COUNT(*) FROM User) 

Для этого SELECT должен вернуть один столбец и один результат, а инструкция SELECT должна быть в скобках.

Edit : Вы пробовали что-то вроде этого?

 DECLARE @OOdate DATETIME SET @OOdate = Select OO.Date from OLAP.OutageHours as OO where OO.OutageID = 1 Select COUNT(FF.HALID) from Outages.FaultsInOutages as OFIO inner join Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE @OODate = FF.FaultDate AND OFIO.OutageID = 1 

– Студия управления Sql Server 2005

use Master go DECLARE @MyVar bigint SET @myvar = (SELECT count(*) FROM spt_values); SELECT @myvar
 Результат: 2346 (в моем db)

Примечание: @myvar = @Myvar

Вы можете использовать:

 declare @foo as nvarchar(25) select @foo = 'bar' select @foo 

Вы также можете просто положить первый SELECT в подзапрос. Так как большинство оптимизаторов все равно сбрасывают его на константу, то не должно быть удара по производительности.

Кстати, поскольку вы используете предикат вроде этого:

 CONVERT(...) = CONVERT(...) 

это предикатное выражение не может быть оптимизировано должным образом или использовать индексы для ссылки на столбцы с помощью функции CONVERT ().

Вот один из способов улучшить исходный запрос:

 DECLARE @ooDate datetime SELECT @ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1 SELECT COUNT(FF.HALID) FROM Outages.FaultsInOutages AS OFIO INNER JOIN Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE FF.FaultDate >= @ooDate AND FF.FaultDate < DATEADD(day, 1, @ooDate) AND OFIO.OutageID = 1 

Эта версия может использоваться в индексе, который связан с FaultDate, и достигает той же цели.

Здесь он перезаписан, чтобы использовать подзапрос, чтобы избежать объявления переменной и последующего SELECT.

 SELECT COUNT(FF.HALID) FROM Outages.FaultsInOutages AS OFIO INNER JOIN Faults.Faults as FF ON FF.HALID = OFIO.HALID WHERE CONVERT(varchar(10), FF.FaultDate, 126) = (SELECT CONVERT(varchar(10), OO.Date, 126) FROM OLAP.OutageHours AS OO where OO.OutageID = 1) AND OFIO.OutageID = 1 

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

С уважением.

Это будет работать для оригинального вопроса:

 DECLARE @Result INT; SELECT @Result = COUNT(*) FROM TableName WHERE Condition 

Что ты конкретно имеешь ввиду? Вы хотите повторно использовать результат запроса для другого запроса?

В этом случае, почему бы вам не объединить оба запроса, сделав второй поиск запроса в результатах первого (SELECT xxx in (SELECT yyy...)

Interesting Posts

sql получить значение столбца, которое все значения в другом столбце не имеют значения

Правильный способ сохранить отдельные данные на сервере sql?

База данных экспорта MSSQL с данными

Создание схемы SQL из XSD и загрузка XML-файлов в SQL Server

Entity Framework не вставлять / обновлять определенный столбец (но все равно столбцы должны отображаться)

Выполнить динамический SQL-файл «alter database» внутри триггера

все возрастающее время INSERT в таблицу

«JOIN» означает то же самое, что «INNER JOIN»

Как реализовать последовательности в Microsoft SQL Server?

SQL – конвертировать varchar (dd / mm / yyyy hh.mm AM / PM) в datetime

Как я могу запланировать запуск контроллера автоматически в моем веб-приложении MVC?

Как повторно использовать вычисленные столбцы, избегая дублирования инструкции sql?

Почему NHibernate Session.Save блокирует базу данных?

Как я могу определить, является ли база данных «пустой» из Java

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

Давайте будем гением компьютера.