2017-04-20 22 views
2

が存在しない場合、私はカーソル(MSSQL)行いますMS SQLクエリ - テーブル

CREATE TABLE #temp 
(
     DB VARCHAR(50), 
     Tab VARCHAR(50), 
     [COUNT] INT 
) 

DECLARE @db_name NVARCHAR (150) 
DECLARE @tab1 NVARCHAR (150) 

set @tab1 = 'dbo.test' 

DECLARE c_db_names CURSOR FOR 

SELECT name 
FROM sys.databases 
WHERE name like '%KNF%' 

OPEN c_db_names 

FETCH c_db_names INTO @db_name 

WHILE @@Fetch_Status = 0 
BEGIN 
    EXEC(' 
    INSERT INTO #temp 
    SELECT ''' + @db_name + ''',''' + @tab1 + ''',COUNT(*) FROM ' + @db_name + '.' + @tab1 + ' 

    ') 
    FETCH c_db_names INTO @db_name 
END 

CLOSE c_db_names 
DEALLOCATE c_db_names 

SELECT * FROM #temp 

DROP TABLE #temp 

カーソルが各データベース・テーブル内の行数をカウントします。そのようなテーブルがない場合、エラーが発生します。

(1 row(s) affected) 

(1 row(s) affected) 
Msg 208, Level 16, State 1, Line 2 
Invalid object name 'KNF_C.dbo.test'. 

(2 row(s) affected) 

明らかに、KNF_Cデータベースにはこのテーブルがないためです。そのような例外を処理するためにカーソル全体を使用したいと思います。

期待される結果:

DB  Tab   COUNT 
KNF_A dbo.test 3 
KNF_B dbo.test 7 
KNF_C no table  

私は存在が、私は方法を知っていけない場合、私は例ための構文を使用する必要があります知っています。

IF OBJECT_ID('dbo.table_name') IS NOT NULL 
    DO SOMETHING; 

するか、sys.databasesのではなく、INFORMATION_SCHEMA.TABLESを使用します。

あなたがOBJECT_IDを使用してオブジェクトの存在を確認することができますSQL Server上でこの

答えて

2

あなたがしなければならないことは、テーブルが存在するかどうかを得るためにsysobjectsテーブルを動的に呼び出すことです。次に、一時テーブルに挿入するものを条件付きで選択します。

これあなたが必要おそらくコード:

CREATE TABLE #temp 
(
     DB VARCHAR(50), 
     Tab VARCHAR(50), 
     [COUNT] INT 
) 
DECLARE @str NVARCHAR(1000) 
DECLARE @db_name NVARCHAR (150) 
DECLARE @tab1 NVARCHAR (150) 
DECLARE @count INT 

set @tab1 = 'dbo.test' 

DECLARE c_db_names CURSOR FOR 

SELECT name 
FROM sys.databases 
WHERE name like '%KNF%' 

OPEN c_db_names 

FETCH c_db_names INTO @db_name 

WHILE @@Fetch_Status = 0 
BEGIN 

     SET @str = N'Select @internalVariable = (select count(1) from ' + @db_name + '.dbo.sysobjects where name = ''' + replace(@tab1, 'dbo.','') + ''') ' 

     exec sp_executesql 
      @str, --dynamic query 
      N'@internalVariable int output', --query parameters 
      @internalVariable = @count output --parameter mapping 
    IF (@count = 1) 
    BEGIN 

     EXEC(' 
     INSERT INTO #temp 
     SELECT ''' + @db_name + ''',''' + @tab1 + ''',COUNT(*) FROM ' + @db_name + '.' + @tab1 + ' 

     ') 
    END 
    ELSE 
    BEGIN 
     EXEC(' 
     INSERT INTO #temp 
     SELECT ''' + @db_name + ''',''no table'', null 
     ') 
    end 

    FETCH c_db_names INTO @db_name 
END 

CLOSE c_db_names 
DEALLOCATE c_db_names 

SELECT * FROM #temp 

DROP TABLE #temp 
+0

いけない仕事: DB \tタブ\t COUNT KNF_A \tなしテーブル\t NULL KNF_B \tなしテーブル\t NULL KNF_C \tなしテーブル\t NULL – Ebasse

+0

それsysobjectsがdb_nameを持つ必要があるため選択されたためです。私は編集しました。 – Avitus

+0

結果はこれと同じですが、「無効なオブジェクト名 'KNF_B.sysobjects'」というエラーです。 – Ebasse

1

を解決するために助けてください。