"With Clause"を使用するサンプルのSQLサーバースクリプトを見せてもらえますか?
この句を使用して、クエリを実行しようとしているのと同じテーブルを含む200個のデータベースを反復処理しようとしています。 whileループを使用するのと同様にクエリ時間がかかるため、カーソルの使用を避けようとしています。
誰かが私にできることについてアドバイスしてもらえますか。
ありがとうございました。
ちょっとしたことですが、ここにFizzBuzzを書く別の方法があります:) WITHステートメントを表示するには100行で十分です。
;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
しかし、SQL Server 2005以降のWITH(背後にあるCommon Table Expression http://msdn.Microsoft.com/en-us/library/ms190766.aspx "CTE")の背後にある真の力は、再帰。以下に示すように、毎回仮想テーブルに追加する反復によってテーブルが構築されます。
;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_foreachdbではなくsp_msforeachdbです。
ただし、期待するものとは異なるものがあるため、使用する場合は注意してください。この例を考えてください
exec sp_msforeachdb 'select count(*) from sys.objects'
各DB内のオブジェクトのカウントの代わりに、同じカウントが報告され、現在のDBのカウントが開始されます。これを回避するには、常に最初にデータベースを「使用」します。マルチワードデータベース名を修飾するために角括弧に注意してください。
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
[〜#〜] with [〜#〜]句には2つのタイプがあります。
以下は、WITH共通テーブル式(CTE)を使用したSQL形式のFizzBuzzです。
;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
これもWITH句を使用したselectステートメントです
SELECT * FROM orders WITH (NOLOCK) where order_id = 123
Sp_foreachdbプロシージャを試してください。