Хранимая процедура для проверки существования таблицы - PullRequest
1 голос
/ 23 июня 2019

Я давно не программирую и застрял в проблеме. Я создаю небольшое приложение, в котором вы можете выбрать один из 32 округов Ирландии.

В моей базе данных с именем BlackCorsetDatabase я хочу использовать только хранимые процедуры.

Я хочу проверить, подключена ли таблица, прежде чем сначала попытаться выполнить запись в базу данных.

Это код, который я написал до сих пор:

CREATE PROCEDURE [dbo].[CheckTableCountyExists]
    (@TableExists BIT)
AS
    IF EXISTS (SELECT * 
               FROM BlackCorsetDatabase 
               WHERE TABLE_NAME = 'County')
    BEGIN
        PRINT 'Table Exists'
        @TableExists = 1
    END
    ELSE
    BEGIN
        Print 'Table does not exists' 
        @TableExists = 0
    END

    RETURN @@TableExists = TableExists
Go

Что мне нужно, так это вывод 1 или 0, чтобы я мог проверить результат в C #

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Вы можете проверить, существует ли таблица несколькими способами - например, используя таблицу метаданных или пытаясь получить к ней доступ.

В любом случае вы захотите использовать динамический 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".

Здесь - этодб <> скрипка.

0 голосов
/ 23 июня 2019

Нет необходимости во всем этом коде, а также не используйте RETURN для возврата значения, оно предназначено для проверки успеха или неудачи SP.

Ваш SP может быть как

CREATE PROCEDURE [dbo].[CheckTableCountyExists]
(
  @DatabaseName SysName,
  @SchemaName SysName,
  @TableName SysName,
  @TableExists BIT = 0 OUTPUT
)
AS
  SELECT @TableExists = 1
  FROM INFORMATION_SCHEMA.TABLES
  WHERE TABLE_CATALOG = @DatabaseName
        AND
        TABLE_SCHEMA = @SchemaName
        AND
        TABLE_NAME = @TableName;
Go

Тогда вы можете использовать его как

DECLARE @MyVar BIT = 0;

EXEC [dbo].[CheckTableCountyExists] N'MyDatabaseName, 
                                    N'MySchemaName', 
                                    N'MyTableName', 
                                    @MyVar;

SELECT @MyVar;

В вы можете проверить выходную переменную @TableExists, если она возвращает 0 (не существует) или 1 (существует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...