MSSQL: Проверка на существование таблицы название которой в переменной

Есть таблица, в которой хранятся названия таблиц, с ними нужно произвести манипуляции, но до этого нужно проверить на существование. Как это можно сделать?

DROP TABLE IF EXISTS #Table;
CREATE TABLE #Table(
     fullTableName VARCHAR(256) NULL
    ,tblDatabase VARCHAR(128) NULL
    ,tblSchema VARCHAR(128) NULL
    ,tblName VARCHAR(128) NULL
);

INSERT INTO #Table(
     fullTableName
    ,tblDatabase
    ,tblSchema
    ,tblName
)
VALUES
     ('master.dbo.sysjobservers','master','dbo','sysjobservers')
    ,('master.maybeis.sysjobschedules','master','maybeis','sysjobschedules')
    ,('msdb.dbo.sysjobschedules','msdb','dbo','sysjobschedules')
    ,('msdb.dbo.sysjobschedules','msdb','dbo','sysjobschedules');

   /* ТУТ НУЖНА КАКАЯ_ТО ПРОВЕРКА НА СУЩЕСТВОВАНИЕ ТАБЛИЦ В БД И УДАЛЕНИЕ ИЗ #Table
    ЧТОБЫ НЕ БЫЛО ОШИБКИ НИЖЕ В  `SET @sqlQuery = 'SELECT * FROM ' + @tblName;`

    все БД заведомо существующие */

DECLARE @tblName VARCHAR(128)
    ,@sqlQuery NVARCHAR(MAX) = ''
    ,@ParmDefinition  NVARCHAR(MAX) ;

DECLARE dataTable CURSOR FOR
SELECT
    [fullTableName]
FROM #Table;

OPEN dataTable;
FETCH NEXT FROM dataTable INTO @tblName;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @ParmDefinition = '
                    @fullTableName VARCHAR(128)
                ';
    SET @sqlQuery = 'SELECT * FROM ' + @tblName;

    EXECUTE sp_executesql @sqlQuery, @ParmDefinition,
        @fullTableName  = @tblName; 

    FETCH NEXT FROM dataTable INTO @tblName;
END

CLOSE dataTable;
DEALLOCATE dataTable;

Как поудалять все из #Table заранее, чтоб не косячить внутри курсора?


Ответы (1 шт):

Автор решения: Yitzhak Khabinsky

Проверить на существование таблицы базы данных: NFORMATION_SCHEMA.TABLES system view очень удобна для этого.

SQL

DECLARE @db_name NVARCHAR(128) = N'...'
    , @schema sysname = '...'
    , @table sysname = '...';

SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_CATALOG = @db_name
    AND TABLE_SCHEMA = @schema
    AND TABLE_NAME = @table;

SQL #2

Это будет работать без переключения контекста для базы данных.

SELECT OBJECT_ID('Adventureworks.Person.Address', 'U') AS Result;
→ Ссылка