SQL Server 2005 Установка переменной для результата запроса select - PullRequest
42 голосов
/ 04 октября 2008

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


Я хочу сделать что-то вроде: Дата обновления

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

Ответы [ 6 ]

68 голосов
/ 04 октября 2008

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

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
13 голосов
/ 05 октября 2011

- Sql Server 2005 Management studio

<code>
use Master
go
DECLARE @MyVar bigint
SET @myvar = (SELECT count(*) FROM spt_values);
SELECT @myvar
</code>
Result: 2346 (in my db)

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

3 голосов
/ 04 октября 2008

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

declare @foo as nvarchar(25)

select @foo = 'bar'

select @foo
2 голосов
/ 14 ноября 2012

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

DECLARE @Result INT;
SELECT @Result = COUNT(*)
FROM  TableName
WHERE Condition
2 голосов
/ 04 октября 2008

Вы также можете просто поместить первый 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. Это можно исправить, добавив подзапрос дважды, но в этом случае вам лучше использовать переменный подход. Эта последняя версия предназначена только для демонстрации.

Привет.

1 голос
/ 04 октября 2008

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

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

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