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

Brug af With Clause SQL Server 2008

Bare et stik, men her er en anden måde at skrive FizzBuzz på :)100 rækker er nok til at vise WITH-sætningen, regner jeg med.

;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

Men den virkelige magt bag WITH (kendt som Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") i SQL Server 2005 og nyere er Recursion, som nedenfor, hvor tabellen er bygget op gennem iterationer, der tilføjes til den virtuelle tabel hver gang.

;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

For at køre en lignende forespørgsel i alle databaser kan du bruge den udokumenterede sp_msforeachdb . Det er blevet nævnt i et andet svar, men det er sp_msforeachdb, ikke sp_foreachdb.

Vær dog forsigtig, når du bruger det, da nogle ting ikke er, hvad du forventer. Overvej dette eksempel

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

I stedet for optællingen af ​​objekter inden for hver DB, vil du få det SAMME antal rapporteret, begynd tallet for den aktuelle DB. For at komme uden om dette, skal du altid "bruge" databasen først. Bemærk de firkantede parenteser for at kvalificere databasenavne med flere ord.

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

Til din specifikke forespørgsel om at udfylde en optællingstabel kan du bruge noget som nedenstående. Ikke sikker på DATE-kolonnen, så denne optællingstabel har kun kolonnerne DBNAME og IMG_COUNT, men håber det hjælper dig.

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. Hvad er den bedste måde at undslippe ikke-formattegn i Oracles to_char?

  2. Hvorfor henter jeg denne fejl migreringsdata fra SQL Lite til Posgres DB? dubletnøgleværdi overtræder unik begrænsning

  3. INSERT INTO vs SELECT INTO

  4. Undslippe søgeordslignende kolonnenavne i Postgres