Подтвердить что ты не робот

Использование "С предложением" SQL Server 2008

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

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

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

Спасибо.

4b9b3361

Ответ 1

Просто тыкать, но вот еще один способ написать 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

Но реальная власть за СЗ (известная как 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'

Вместо подсчета объектов внутри каждой БД вы получите ТОЛЬКО счетчик, начинающийся с текущей БД. Чтобы обойти это, сначала "используйте" базу данных. Обратите внимание на квадратные скобки, чтобы квалифицировать имена многословных баз данных.

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

Ответ 2

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

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

;WITH mil AS (
 SELECT TOP 1000000 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
 FROM master.sys.all_columns as c
 CROSS JOIN master.sys.all_columns as c2
)                
 SELECT CASE WHEN n  % 3 = 0 THEN
             CASE WHEN n  % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
        WHEN n % 5 = 0 THEN 'Buzz'
        ELSE CAST(n AS char(6))
     END + CHAR(13)
 FROM mil

Вот оператор select, также используя предложение WITH

SELECT * FROM orders WITH (NOLOCK) where order_id = 123

Ответ 3

Попробуйте выполнить процедуру sp_foreachdb.