sql >> Base de Datos >  >> RDS >> Sqlserver

Uso de la cláusula With SQL Server 2008

Solo un toque, pero aquí hay otra forma de escribir FizzBuzz :) 100 filas son suficientes para mostrar la declaración CON, creo.

;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

Pero el poder real detrás de WITH (conocido como Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") en SQL Server 2005 y superior es la Recursión, como se muestra a continuación, donde la tabla se crea a través de iteraciones que se agregan a la tabla virtual cada vez.

;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

Para ejecutar una consulta similar en todas las bases de datos, puede usar el sp_msforeachdb no documentado . Se ha mencionado en otra respuesta, pero es sp_msforeachdb, no sp_foreachdb.

Sin embargo, tenga cuidado al usarlo, ya que algunas cosas no son lo que espera. Considere este ejemplo

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

En lugar de los conteos de objetos dentro de cada base de datos, obtendrá el MISMO conteo informado, comience con el de la base de datos actual. Para evitar esto, siempre "utilice" la base de datos primero. Tenga en cuenta los corchetes para calificar nombres de bases de datos de varias palabras.

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

Para su consulta específica sobre cómo completar una tabla de conteo, puede usar algo como lo siguiente. No estoy seguro acerca de la columna DATE, por lo que esta tabla de conteo solo tiene las columnas DBNAME e IMG_COUNT, pero espero que te ayude.

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