Gewoon een por, maar hier is een andere manier om FizzBuzz te schrijven :) 100 rijen is genoeg om het WITH-statement te tonen, denk ik.
;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
Maar de echte kracht achter WITH (bekend als Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") in SQL Server 2005 en hoger is de recursie, zoals hieronder, waar de tabel wordt opgebouwd door middel van iteraties die elke keer aan de virtuele tabel worden toegevoegd.
;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
Om een vergelijkbare zoekopdracht in alle databases uit te voeren, kunt u de ongedocumenteerde sp_msforeachdb gebruiken . Het is genoemd in een ander antwoord, maar het is sp_msforeachdb, niet sp_foreachdb.
Wees echter voorzichtig bij het gebruik, want sommige dingen zijn niet wat je verwacht. Overweeg dit voorbeeld
exec sp_msforeachdb 'select count(*) from sys.objects'
In plaats van de tellingen van objecten binnen elke DB, krijgt u DEZELFDE telling gerapporteerd, beginnend met die van de huidige DB. Om dit te omzeilen, moet u altijd eerst de database "gebruiken". Let op de vierkante haken om databasenamen met meerdere woorden te kwalificeren.
exec sp_msforeachdb 'use [?]; select count(*) from sys.objects'
Voor uw specifieke vraag over het invullen van een tallytabel, kunt u zoiets als het onderstaande gebruiken. Ik weet niet zeker wat de kolom DATE is, dus deze tallytabel heeft alleen de kolommen DBNAME en IMG_COUNT, maar ik hoop dat het je helpt.
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