Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на клаузата With SQL Server 2008

Само едно мушкане, но ето още един начин да напишете FizzBuzz :) 100 реда са достатъчни, за да покажа израза WITH, предполагам.

;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

Но истинската сила зад WITH (известен като Common Table Expression http://msdn.microsoft.com/en-us/library/ms190766.aspx "CTE") в SQL Server 2005 и по-нови е рекурсията, както по-долу, където таблицата се изгражда чрез итерации, добавящи се към виртуалната таблица всеки път.

;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

За да изпълните подобна заявка във всички бази данни, можете да използвате недокументирания sp_msforeachdb . Споменато е в друг отговор, но е sp_msforeachdb, а не sp_foreachdb.

Бъдете внимателни, когато го използвате, тъй като някои неща не са това, което очаквате. Разгледайте този пример

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

Вместо броя на обектите във всяка DB, ще получите СЪЩИЯ отчетен брой, като започнете този от текущата DB. За да заобиколите това, винаги първо "използвайте" базата данни. Обърнете внимание на квадратните скоби, за да определите имената на базата данни с много думи.

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

За вашата конкретна заявка за попълване на таблица за изчисление можете да използвате нещо като по-долу. Не съм сигурен за колоната ДАТА, така че тази таблица за изчисление има само колоните DBNAME и IMG_COUNT, но се надявам, че ще ви помогне.

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. Низови функции на SQL Server (пълен списък)

  2. SQL Server:как да попитам кога е направено последното резервно копие на регистъра на транзакциите?

  3. Как да групирам по непрекъснати диапазони

  4. Как мога да вмъкна данни от двоичен файл в двоично SQL поле с помощта на прост оператор за вмъкване?

  5. Заявката работи бързо в Query Analyzer, но бавно в C# приложение