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
Ответы
Ответ 1
Вы можете использовать что-то вроде
SET @cnt = (SELECT COUNT(*) FROM User)
или
SELECT @cnt = (COUNT(*) FROM User)
Для этого SELECT должен возвращать один столбец и один результат, а инструкция SELECT должна быть в скобках.
Изменить. Вы пробовали что-то вроде этого?
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
Ответ 2
- Студия управления Sql Server 2005
use Master
go
DECLARE @MyVar bigint
SET @myvar = (SELECT count(*) FROM spt_values);
SELECT @myvar
Result: 2346 (in my db)
- Примечание: @myvar = @Myvar
Ответ 3
Вы можете использовать:
declare @foo as nvarchar(25)
select @foo = 'bar'
select @foo
Ответ 4
Вы также можете просто поместить первый 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. Это можно было бы устранить, добавив подзапрос дважды, но в этом случае вам будет лучше обслуживаться переменный подход. Эта последняя версия предназначена только для демонстрации.
С уважением.
Ответ 5
Это будет работать для заданного вопроса:
DECLARE @Result INT;
SELECT @Result = COUNT(*)
FROM TableName
WHERE Condition
Ответ 6
Что ты имеешь в виду? Вы хотите повторно использовать результат запроса для другого запроса?
В этом случае, почему бы вам не объединить оба запроса, сделав второй поиск запроса в результатах первого (SELECT xxx in (SELECT yyy...)