Один из способов - написать новый метод расширения
public static bool IsSingle<T>(this IEnumerable<T> enumerable) {
using (var enumerator = enumerable.GetEnumerator()) {
if (!enumerator.MoveNext()) {
return false;
}
return !enumerator.MoveNext();
}
}
. Одна из причин вашего вопроса может заключаться в том, чтобы сделать представление более оптимизируемым, удалив преобразование данных. Невозможно сделать это в представлении, вам нужно сделать его хранимой процедурой и выполнить преобразование в переменную:
CREATE PROCEDURE RecentRecordSum AS
DECLARE @adate DATETIME
SELECT @adate = DATEADD(d, -7, GETDATE())
SELECT t.ID,
SUM(t.SomeValue) AS ValueSum
FROM SomeTable t
WHERE t.RecordDate >= @adate
GROUP BY t.ID
Еще один снимок в темноте, как и все ...
Возможно, вы хотите сделать это индексированное представление, что вы не сможете сделать с помощью getdate (), поскольку это неопределенная функция. Раньше я обходил это, вызывая getdate () из другого представления, которое просто содержит
select getdate()
. Этого уровня косвенного обращения было достаточно, чтобы обмануть SQL Server 2000 и позволить мне использовать привязку схемы, но я не могу гарантировать, что это будет работать позже. версии.
Предполагая, что у вас есть данные за последний день, подзапрос может сработать:
CREATE VIEW RecentRecordSum AS
SELECT t.ID,
SUM(t.SomeValue) AS ValueSum
FROM SomeTable t
WHERE t.RecordDate >= DATEADD(d,-7,(Select Max(RecordDate) From SomeTable))
GROUP BY t.ID
Если я правильно понимаю вопрос, вы всегда можете попробовать внутреннее соединение с набором, содержащим GETDATE (), как в следующем запросе:
SELECT t.ID,
SUM(t.SomeValue) AS ValueSum
FROM SomeTable t
INNER JOIN (SELECT DATEADD(d,-7,GETDATE()) AS MIN_DATE) MIN_DATE_SET
ON t.RecordDate >= MIN_DATE_SET.MIN_DATE
GROUP BY t.ID
EDIT: Я просмотрел план запроса для аналогичного сценария, и они идентичны. YMMV.
SELECT CURRENT_TIMESTAMP
SELECT {fn NOW()}
Возможно, я неправильно понял вопрос, если вы просто пытаетесь переместить GetDate (), а не заменять его, вы можете выполнить оценку в предложении Have, т.е.
CREATE VIEW RecentRecordSum AS
SELECT t.ID,
SUM(t.SomeValue) AS ValueSum
FROM SomeTable t
GROUP BY t.ID, t.RecordDate
HAVING t.RecordDate >= DATEADD(d,-7,GETDATE())