Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden der With-Klausel SQL Server 2008

Nur ein Scherz, aber hier ist eine andere Art, FizzBuzz zu schreiben :) 100 Zeilen reichen aus, um die WITH-Anweisung anzuzeigen, denke ich.

;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

Aber die wirkliche Kraft hinter WITH (bekannt als Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") in SQL Server 2005 und höher ist die Rekursion, wie unten, wo die Tabelle durch Iterationen aufgebaut wird, die jedes Mal zur virtuellen Tabelle hinzugefügt werden.

;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

Um eine ähnliche Abfrage in allen Datenbanken auszuführen, können Sie die undokumentierte sp_msforeachdb verwenden . Es wurde in einer anderen Antwort erwähnt, aber es ist sp_msforeachdb, nicht sp_foreachdb.

Seien Sie jedoch vorsichtig, wenn Sie es verwenden, da einige Dinge nicht Ihren Erwartungen entsprechen. Betrachten Sie dieses Beispiel

exec sp_msforeachdb 'select count(*) from sys.objects'

Anstelle der Anzahl der Objekte in jeder DB erhalten Sie die GLEICHE Anzahl gemeldet, beginnend mit der der aktuellen DB. Um dies zu umgehen, "verwenden" Sie immer zuerst die Datenbank. Beachten Sie die eckigen Klammern, um Datenbanknamen mit mehreren Wörtern zu qualifizieren.

exec sp_msforeachdb 'use [?]; select count(*) from sys.objects'

Für Ihre spezifische Abfrage zum Füllen einer Tally-Tabelle können Sie etwas wie das Folgende verwenden. Ich bin mir bei der DATE-Spalte nicht sicher, daher enthält diese Tally-Tabelle nur die Spalten DBNAME und IMG_COUNT, aber ich hoffe, es hilft Ihnen.

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