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;