Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de la clause With SQL Server 2008

Juste un coup de pouce, mais voici une autre façon d'écrire FizzBuzz :) 100 lignes suffisent pour afficher l'instruction WITH, je pense.

;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

Mais le vrai pouvoir derrière WITH (connu sous le nom d'expression de table commune http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") dans SQL Server 2005 et supérieur est la récursivité, comme ci-dessous où la table est construite à travers des itérations ajoutées à la table virtuelle à chaque fois.

;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

Pour exécuter une requête similaire dans toutes les bases de données, vous pouvez utiliser le sp_msforeachdb non documenté . Cela a été mentionné dans une autre réponse, mais c'est sp_msforeachdb, pas sp_foreachdb.

Soyez prudent lorsque vous l'utilisez, car certaines choses ne correspondent pas à vos attentes. Prenons cet exemple

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

Au lieu du nombre d'objets dans chaque base de données, vous obtiendrez le même nombre signalé, commencez par celui de la base de données actuelle. Pour contourner ce problème, "utilisez" toujours la base de données en premier. Notez les crochets pour qualifier les noms de bases de données à plusieurs mots.

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

Pour votre requête spécifique sur le remplissage d'une table de pointage, vous pouvez utiliser quelque chose comme ci-dessous. Pas sûr de la colonne DATE, donc cette table de pointage ne contient que les colonnes DBNAME et IMG_COUNT, mais j'espère que cela vous aidera.

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