2017-04-20 50 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  

我知道是否存在但我不知道我應該如何使用語法例如

請幫助解決這個

回答

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

在SQL Server上,您可以檢查使用OBJECT_ID物體的存在:

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

或者使用INFORMATION_SCHEMA.TABLES代替sys.databases中的。