Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzo della clausola With SQL Server 2008

Solo un colpo, ma ecco un altro modo per scrivere FizzBuzz :)100 righe sono sufficienti per mostrare l'istruzione WITH, credo.

;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

Ma il vero potere dietro WITH (noto come Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") in SQL Server 2005 e versioni successive è la ricorsione, come di seguito in cui la tabella viene creata tramite iterazioni aggiunte ogni volta alla tabella virtuale.

;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

Per eseguire una query simile in tutti i database, puoi utilizzare il file sp_msforeachdb non documentato . È stato menzionato in un'altra risposta, ma è sp_msforeachdb, non sp_foreachdb.

Fai attenzione quando lo usi, perché alcune cose non sono quelle che ti aspetti. Considera questo esempio

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

Invece dei conteggi di oggetti all'interno di ciascun DB, otterrai lo STESSO conteggio riportato, inizia quello del DB corrente. Per aggirare questo problema, "usa" sempre prima il database. Nota le parentesi quadre per qualificare i nomi di database di più parole.

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

Per la tua domanda specifica sulla compilazione di una tabella di conteggio, puoi utilizzare qualcosa come il seguente. Non sono sicuro della colonna DATE, quindi questa tabella di conteggio ha solo le colonne DBNAME e IMG_COUNT, ma spero che ti aiuti.

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