sql >> Database >  >> RDS >> Sqlserver

De With-clausule SQL Server 2008 gebruiken

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


  1. Verschil tussen int en int(2) datatypes in mijn sql

  2. Hoe kan ik tijdelijke aanduidingen voor Flyway negeren?

  3. Schending integriteitsbeperking:1452 laravel

  4. Tabel maken vanuit weergave - Oracle SQL SQL-fout:ORA-01723:kolommen met lengte nul zijn niet toegestaan