2012-02-17 6 views
4

データベース健全性検査コードの場合、特定のobject_idが空のテーブルに対応するかどうかを確認したいと思います。MSSQL:テーブルのobject_idを指定して、空であるかどうかを確認します。

(例えば)select count(*) from magic_operator(my_object_id)またはそれに類する方法がありますか?

私はMS SQL Server 2008b上で実行できる純粋なSQLソリューションを強くお勧めします。

答えて

11

あなたは精度保証をしたい場合は、2つのパーツオブジェクト名を含む、動的SQL文字列を作成して実行する必要があります

SELECT SUM(rows) 
FROM sys.partitions p 
WHERE index_id < 2 and [email protected]_object_id 

から大まかなアイデアを得ることができます。以下の例では、これをどのように使用しているかによって、sp_executesqlを使用し、結果を代わりに出力パラメータとして返すことができます。

DECLARE @DynSQL nvarchar(max) = 
      N'SELECT CASE WHEN EXISTS(SELECT * FROM ' + 
      QUOTENAME(OBJECT_SCHEMA_NAME(@my_object_id)) + '.' + 
        QUOTENAME(OBJECT_NAME(@my_object_id)) + 
      ') THEN 0 ELSE 1 END AS IsEmpty' 


EXECUTE (@DynSQL) 
+0

とにかく私はいつも 'sp_executesql'を使用します。 'COUNT(*)'の代わりに 'EXISTS'を使うだけでなく、2つのオプションの+1も... –

+0

Wow - 最初の解決策はどのように機能しますか?何らかのインデックスの行数を調べているので、特定のファイルグループの行を推測していますか?なぜそれは正確ではないでしょうか?それは第二のものよりも単純に見えます、それで十分であれば。それは私が使用するものです - ありがとう! –

+1

@EamonNerbonne - 100%正確であることは保証されていません。これにはコミットされていないトランザクションの影響も含まれます(手動で更新することもできます)(http://sqlblog.com/blogs/ben_nevarez/archive/2010/01/13/fooling-the-query-optimizer.aspx)、同期が外れることがありますときどき、DBCC UPDATEUSAGEで修正する必要があります(正確なタイミングはわかりません) –

3

まあ、それはあなたが、私は以下のソリューションを作ってみたPure sql として考える何をすべきかに依存します。それは純粋にT-SQLで書かれているが、動的に変化はコメントで説明可能な障害のある例を考えてみ

クエリ

-- Using variables just for better readability. 
DECLARE @Name NVARCHAR(4000) 
DECLARE @Schema NVARCHAR(4000) 
DECLARE @Query NVARCHAR(4000) 

-- Get the relevant data 
SET @Schema = QUOTENAME(OBJECT_SCHEMA_NAME(613577224)) 
SET @Name = QUOTENAME(OBJECT_NAME(613577224)) 
-- Build query taking into consideration the schema and possible poor object naming 
SET @Query = 'SELECT COUNT(*) FROM ' + @Schema + '.' + @Name + '' 
-- execute it. 
EXEC(@Query) 

EDITを構築し使用します。

これは便利なアプローチなので、変数の概要を説明しました。乾杯。

+1

「Set @Query = 'SELECT COUNT(*)FROM '+ OBJECT_NAME(@ my_object_id)+'; ''?中間的な '@ Name'変数はあなたに何を購入しますか?また、スキーマが 'dbo'(または現在のユーザのデフォルトスキーマ)でない場合はどうなりますか?この場合には 'OBJECT_SCHEMA_NAME'をインクルードすると便利です。最後に、 'my table'や' my-table'のように、テーブルの名前が正しくない場合はどうなりますか? 'QUOTENAME'でオブジェクトへの参照を囲むのに便利です。 –

+0

純粋なSQLで私は自己完結型を意味します。いくつかの外部スクリプトエンジンは必要ありません:-) - 動的に生成されたSQLは安全です。 –

+0

@AaronBertrand '@ Name'変数は何も意味しません。ここでのポイントは、クエリの可能性を示すことです。 – Oybek

関連する問題