Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Korzystanie z klauzuli With SQL Server 2008

Tylko grzebanie, ale oto inny sposób na napisanie FizzBuzz :) 100 wierszy wystarczy, aby wyświetlić instrukcję WITH, jak sądzę.

;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

Ale prawdziwa siła stojąca za WITH (znana jako Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") w SQL Server 2005 i nowszych wersjach to Rekurencja, jak poniżej, gdzie tabela jest budowana poprzez iteracje dodawania do wirtualnej tabeli za każdym razem.

;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

Aby uruchomić podobne zapytanie we wszystkich bazach danych, możesz użyć nieudokumentowanej sp_msforeachdb . Zostało to wspomniane w innej odpowiedzi, ale jest to sp_msforeachdb, a nie sp_foreachdb.

Zachowaj jednak ostrożność podczas korzystania z niego, ponieważ niektóre rzeczy nie są tym, czego oczekujesz. Rozważ ten przykład

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

Zamiast zliczania obiektów w każdej bazie danych, otrzymasz raport o takiej samej liczbie, zacznij od aktualnej bazy danych. Aby obejść ten problem, zawsze najpierw "użyj" bazy danych. Zwróć uwagę na nawiasy kwadratowe, aby zakwalifikować wielowyrazowe nazwy baz danych.

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

W przypadku konkretnego zapytania dotyczącego wypełniania tabeli z zestawieniami możesz użyć czegoś podobnego do poniższego. Nie jestem pewien co do kolumny DATE, więc ta tabela zawiera tylko kolumny DBNAME i IMG_COUNT, ale mam nadzieję, że to pomoże.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyświetlić plan wykonywania zapytań w Azure Data Studio (SQL Server)

  2. Jak mogę rozszerzyć to zapytanie SQL, aby znaleźć k najbliższych sąsiadów?

  3. Tabele z listą SQL Server:Jak wyświetlić wszystkie tabele

  4. Jak zwrócić tylko wartości liczbowe w SQL Server

  5. Entity Framework Code First z synonimami SQL Server