Вы можете проверить, существует ли таблица несколькими способами - например, используя таблицу метаданных или пытаясь получить к ней доступ.
В любом случае вы захотите использовать динамический SQL.
Кроме того, я настоятельно рекомендую возвращать значения из хранимой процедуры, используя параметры OUTPUT , а не RETURN .Если вы хотите RETURN , вам, вероятно, нужна сохраненная функция.
Мне нравится подход Сами по передаче имен компонентов, которые вы ищете.Вот версия, которая должна работать:
CREATE PROCEDURE dbo.CheckTableCountyExists (
@DatabaseName SysName,
@SchemaName SysName,
@TableName SysName,
@TableExists BIT = 0 OUTPUT
) AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = '
SELET @TableExists =
(CASE WHEN EXISTS (SELECT 1
FROM @DatabaseName.INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_SCHEMA = @SchemaName AND
t.TABLE_NAME = @TableName
)
THEN 1 ELSE 0
END)';
SET @sql = REPLACE(@sql, '@DatabaseName', QUOTENAME(@DatabaseName));
EXEC sp_executesql @sql,
N'@SchemaName sysname, @TableName sysname, @TableExists BIT',
@SchemaName=@SchemaName, @TableName=@TableName, @TableExists=@TableExists;
END;
Тогда вы называете это как:
DECLARE @isExists BIT = 0;
EXEC dbo.CheckTableExists N'BlackCorsetDatabase',
N'dbo',
N'County',
@isExists OUTPUT;
SELECT @isExists;
Выше не получится, хотя, если база данных не работаетсуществовать.Вы можете исправить это с помощью TRY
/ CATCH
.Общий метод:
CREATE PROCEDURE dbo.CheckTableCountyExists (
@DatabaseName SysName,
@SchemaName SysName,
@TableName SysName,
@TableExists BIT = 0 OUTPUT
) AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = '
SELET @TableExists =
(CASE WHEN EXISTS (SELECT 1
FROM @DatabaseName.INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_SCHEMA = @SchemaName AND
t.TABLE_NAME = @TableName
)
THEN 1 ELSE 0
END)';
SET @sql = REPLACE(@sql, '@DatabaseName', QUOTENAME(@DatabaseName));
BEGIN TRY
EXEC sp_executesql @sql,
N'@SchemaName sysname, @TableName sysname, @TableExists BIT',
@SchemaName=@SchemaName,
@TableName=@TableName,
@TableExists=@TableExists;
END TRY
BEGIN CATCH
-- on any error, assume table does not exist
SET @TableExists = 0
END CATCH;
END;
Примечание. Вы можете более подробно рассказать об ошибке.Тем не менее, трудно представить ситуацию, когда код работает, но вы получаете ошибку в динамическом SQL и хотят вернуть "1".
Здесь - этодб <> скрипка.