Использование «с предложением» SQL Server 2008 - PullRequest
20 голосов
/ 15 января 2011

Может кто-нибудь показать мне пример сценария SQL-сервера, на который я могу посмотреть, который использует "With Clause" ?

Я пытаюсь использовать это предложение для перебора 200 баз данных, содержащих ту же таблицу, к которой я пытаюсь выполнить запрос.Я пытаюсь избежать использования курсора, потому что время запроса занимает слишком много времени, а также использование цикла while.

Может кто-нибудь посоветовать мне, что я могу сделать.

Спасибо.

Ответы [ 3 ]

36 голосов
/ 16 января 2011

Просто поцелуй, но вот еще один способ написать 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 Expressionhttp://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'

Вместо количества объектов в каждой БД вы получите ТОТ ЖЕ сообщенный счет, начните счет текущей БД.Чтобы обойти это, всегда сначала «используйте» базу данных.Обратите внимание на квадратные скобки, чтобы квалифицировать имена базы данных из нескольких слов.

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

Для вашего конкретного запроса о заполнении таблицы подсчета вы можете использовать что-то вроде ниже.Не уверен насчет столбца DATE, поэтому в этой итоговой таблице есть только столбцы 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
8 голосов
/ 15 января 2011

Существует два типа предложений WITH :

Вот форма FizzBuzz в SQL, использующая общее табличное выражение WITH (CTE).Вот оператор выбора, также использующий предложение WITH

SELECT * FROM orders WITH (NOLOCK) where order_id = 123
1 голос
/ 15 января 2011

Попробуйте процедуру sp_foreachdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...