Просто поцелуй, но вот еще один способ написать FizzBuzz :), я считаю, 100 строк достаточно, чтобы показать оператор WITH.
;WITH t100 AS (
SELECT n=number
FROM master..spt_values
WHERE type='P' and number between 1 and 100
)
SELECT
ISNULL(NULLIF(
CASE WHEN n % 3 = 0 THEN 'Fizz' Else '' END +
CASE WHEN n % 5 = 0 THEN 'Buzz' Else '' END, ''), RIGHT(n,3))
FROM t100
Но реальная сила позади WITH (известного как Common Table Expressionhttp://msdn.microsoft.com/en-us/library/ms190766.aspx «CTE») в SQL Server 2005 и более поздних версиях - это рекурсия, как показано ниже, где таблица создается с помощью итераций, каждый раз добавляемых в виртуальную таблицу.
;WITH t100 AS (
SELECT n=1
union all
SELECT n+1
FROM t100
WHERE n < 100
)
SELECT
ISNULL(NULLIF(
CASE WHEN n % 3 = 0 THEN 'Fizz' Else '' END +
CASE WHEN n % 5 = 0 THEN 'Buzz' Else '' END, ''), RIGHT(n,3))
FROM t100
Для запускаАналогичный запрос во всей базе данных можно использовать недокументированную sp_msforeachdb .Это было упомянуто в другом ответе, но это sp_msforeachdb, а не sp_foreachdb.
Будьте осторожны при его использовании, поскольку некоторые вещи не соответствуют вашим ожиданиям.Рассмотрим этот пример
exec sp_msforeachdb 'select count(*) from sys.objects'
Вместо количества объектов в каждой БД вы получите ТОТ ЖЕ сообщенный счет, начните счет текущей БД.Чтобы обойти это, всегда сначала «используйте» базу данных.Обратите внимание на квадратные скобки, чтобы квалифицировать имена базы данных из нескольких слов.
exec sp_msforeachdb 'use [?]; select count(*) from sys.objects'
Для вашего конкретного запроса о заполнении таблицы подсчета вы можете использовать что-то вроде ниже.Не уверен насчет столбца DATE, поэтому в этой итоговой таблице есть только столбцы DBNAME и IMG_COUNT, но надеюсь, что она вам поможет.
create table #tbl (dbname sysname, img_count int);
exec sp_msforeachdb '
use [?];
if object_id(''tbldoc'') is not null
insert #tbl
select ''?'', count(*) from tbldoc'
select * from #tbl