Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan With Clause SQL Server 2008

Hanya sedikit, tapi inilah cara lain untuk menulis FizzBuzz :)100 baris sudah cukup untuk menampilkan pernyataan WITH, menurut saya.

;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

Tetapi kekuatan sebenarnya di balik WITH (dikenal sebagai Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") di SQL Server 2005 dan di atasnya adalah Rekursi, seperti di bawah ini di mana tabel dibangun melalui iterasi yang ditambahkan ke tabel virtual setiap kali.

;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

Untuk menjalankan kueri serupa di semua basis data, Anda dapat menggunakan sp_msforeachdb yang tidak berdokumen . Telah disebutkan dalam jawaban lain, tetapi sp_msforeachdb, bukan sp_foreachdb.

Hati-hati saat menggunakannya, karena beberapa hal tidak seperti yang Anda harapkan. Perhatikan contoh ini

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

Alih-alih jumlah objek dalam setiap DB, Anda akan mendapatkan jumlah yang SAMA yang dilaporkan, mulai dari DB saat ini. Untuk menyiasatinya, selalu "gunakan" database terlebih dahulu. Perhatikan tanda kurung siku untuk memenuhi syarat nama database multi-kata.

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

Untuk kueri spesifik Anda tentang mengisi tabel penghitungan, Anda dapat menggunakan sesuatu seperti di bawah ini. Tidak yakin tentang kolom DATE, jadi tabel penghitungan ini hanya memiliki kolom DBNAME dan IMG_COUNT, tetapi semoga membantu Anda.

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. Mendapatkan Tanggal di antara rentang tanggal

  2. Contoh Konversi 'waktu' ke 'waktu waktu' di SQL Server (T-SQL)

  3. "Permintaan tidak diizinkan di Waitfor" Kesalahan 101 di SQL Server

  4. Hapus SCHEMABINDING dari Fungsi Buatan Pengguna di SQL Server

  5. Memaksa code-first untuk selalu menginisialisasi database yang tidak ada?