web-dev-qa-db-ja.com

「With Clause」SQL Server 2008の使用

"With Clause"を使用するサンプルのSQLサーバースクリプトを見せてもらえますか?

この句を使用して、クエリを実行しようとしているのと同じテーブルを含む200個のデータベースを反復処理しようとしています。 whileループを使用するのと同様にクエリ時間がかかるため、カーソルの使用を避けようとしています。

誰かが私にできることについてアドバイスしてもらえますか。

ありがとうございました。

21
Jeff

ちょっとしたことですが、ここにFizzBu​​zzを書く別の方法があります:) 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
36
RichardTheKiwi

[〜#〜] with [〜#〜]句には2つのタイプがあります。

以下は、WITH共通テーブル式(CTE)を使用したSQL形式のFizzBu​​zzです。

;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
8
Simon Hughes

Sp_foreachdbプロシージャを試してください。

1
Joel Coehoorn