Ответ 1
Просто тыкать, но вот еще один способ написать 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
Но реальная власть за СЗ (известная как Common Table Expression http://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