Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando a cláusula With SQL Server 2008


Apenas um cutucão, mas aqui está outra maneira de escrever FizzBuzz :) 100 linhas são suficientes para mostrar a instrução WITH, eu acho.
;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

Mas o verdadeiro poder por trás do WITH (conhecido como Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") no SQL Server 2005 e acima é a Recursão, conforme abaixo, onde a tabela é construída por meio de iterações adicionadas à tabela virtual a 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 executar uma consulta semelhante em todos os bancos de dados, você pode usar o sp_msforeachdb não documentado . Foi mencionado em outra resposta, mas é sp_msforeachdb, não sp_foreachdb.

Tenha cuidado ao usá-lo, pois algumas coisas não são o que você espera. Considere este exemplo
exec sp_msforeachdb 'select count(*) from sys.objects'

Em vez das contagens de objetos dentro de cada banco de dados, você obterá a MESMA contagem relatada, comece a do banco de dados atual. Para contornar isso, sempre "use" o banco de dados primeiro. Observe os colchetes para qualificar nomes de banco de dados com várias palavras.
exec sp_msforeachdb 'use [?]; select count(*) from sys.objects'

Para sua consulta específica sobre o preenchimento de uma tabela de contagem, você pode usar algo como o abaixo. Não tenho certeza sobre a coluna DATE, então esta tabela de contagem tem apenas as colunas DBNAME e IMG_COUNT, mas espero que ajude você.
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