Ошибка в моей хранимой процедуре в SQL Server - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь написать хранимую процедуру, которая будет проверять:

  1. Если таблица и столбцы существуют, мы записываем данные
  2. Если таблица не существует, мы создаем ее и записываем данные
  3. Если таблица существует, мы проверяем существующие столбцы и записываем данные в существующие Колонки

Это код:

CREATE PROCEDURE [dbo].[my_proc] @file_path VARCHAR(1000) = NULL
    ,@file_type VARCHAR(1000) = NULL
    ,@file_name VARCHAR(1000) = NULL
    ,@table_name VARCHAR(1000)
AS
BEGIN
    DECLARE @sql NVARCHAR(4000);

    SET @table_name = '[dbo].[' + @table_name + ']'
    SET @sql = '
    DECLARE @msg VARCHAR(max)

    --if column and table exist
    IF (
            EXISTS (
                SELECT *
                FROM sys.objects
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                ) --табличка
            AND EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                    AND (
                        NAME = '' path_file ''
                        AND NAME = '' file_type ''
                        AND NAME = '' file_name ''
                        )
                )
            ) --поля
    BEGIN
        INSERT INTO ' + @table_name + ' (
            file_path
            ,file_type
            ,file_name
            )
        VALUES (
            ''' + isnull(@file_path, '') + '''
            ,''' + isnull(@file_type, '') + '''
            ,''' + isnull(@f ile_name, '') + '''
            )
    END

    --if table not exist
    IF NOT EXISTS (
            SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
            )
    BEGIN
        CREATE TABLE ' + @table_name + ' (
            id INT NOT NULL identity(1, 1) PRIMARY KEY
            ,file_path TEXT
            ,file_name TEXT
            ,file_type TEXT
            )
    END

    --if table exist
    IF EXISTS (
            SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
            )
    BEGIN
        --check for columns in table
        --file_path
        IF NOT EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                    AND (
                        NAME = ''path_file''
                        OR NAME = ''file_path''
                        )
                )
        BEGIN
            PRINT (''NOT COLUMN path_file'')
        END

        --file name
        IF NOT EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', '' U '')
                    AND NAME = '' file_name ''
                )
        BEGIN
            PRINT ('' NOT COLUMN file_name '')
        END

        --file_type
        IF NOT EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                    AND (
                        NAME = ''file_type''
                        OR NAME = ''file_type''
                        )
                )
        BEGIN
            PRINT (''NOT COLUMN file_type'')
        END
        ELSE
            INSERT INTO ' + @table_name + ' (
                file_path
                ,file_name
                ,file_type
                )
            VALUES (
                ''' + isnull(@file_path, '') + '''
                ,''' + isnull(@file_name, '') + '''
                ,''' + isnull(@f ile_type, '') + '''
                )
    END';

    EXEC (@sql);
END

Проблема с уже существующей таблицей, но без столбцов мне нужна

Помогите мне, пожалуйста

1 Ответ

0 голосов
/ 28 августа 2018

Я попытался запустить ваш скрипт, и единственной ошибкой была пропущенная объявленная переменная.

Вы писали "@f ile_name" с пустым пробелом.

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

CREATE PROCEDURE [dbo].[my_proc] 
    @file_path VARCHAR(1000) = NULL
    ,@file_type VARCHAR(1000) = NULL
    ,@file_name VARCHAR(1000) = NULL
    ,@table_name VARCHAR(1000)
AS
BEGIN
    DECLARE @sql NVARCHAR(4000);
    DECLARE @msg VARCHAR(max);

    SET @table_name = '[dbo].[' + @table_name + ']'
    SET @sql = '
    --If table not exist then we create it
    IF NOT EXISTS (
            SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(N''' + @table_name + ''')
                AND type IN (N''U'')
            )
    BEGIN
        CREATE TABLE ' + @table_name + ' (
            id INT NOT NULL identity(1, 1) PRIMARY KEY
            ,file_path TEXT
            ,file_name TEXT
            ,file_type TEXT
            )
    END';

    EXEC (@sql);

    SET @sql = '
    --If table exist then we check existing columns and we write data into exists columns
    IF EXISTS (
            SELECT *
            FROM sys.objects
            WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
            )
    BEGIN
        PRINT (''TABLE found'')

        --check for columns in table
        --file_path
        IF NOT EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', '' U '')
                    AND (
                        NAME = '' path_file ''
                        OR NAME = ''file_path''
                        )
                )
        BEGIN
            PRINT (''NOT COLUMN path_file'')
        END

        --file name
        IF NOT EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                    AND NAME = ''file_name''
                )
        BEGIN
            PRINT (''NOT COLUMN file_name'')
        END

        --file_type
        IF NOT EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                    AND (
                        NAME = ''file_type''
                        OR NAME = ''file_type''
                        )
                )
        BEGIN
            PRINT (''NOT COLUMN file_type'')
        END
        ELSE
            INSERT INTO ' + @table_name + ' (
                file_path
                ,file_name
                ,file_type
                )
            VALUES (
                ''' + isnull(@file_path, '') + '''
                ,''' + isnull(@file_name, '') + '''
                ,''' + isnull(@file_type, '') + '''
                )
    END';

    EXEC (@sql);

    SET @sql = '
    --If table and columns exists then we write data
    IF (
            EXISTS (
                SELECT *
                FROM sys.objects
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                ) --табличка
            AND EXISTS (
                SELECT *
                FROM sys.columns
                WHERE object_id = OBJECT_ID(''' + @table_name + ''', ''U'')
                    AND (
                        NAME = ''path_file''
                        AND NAME = ''file_type''
                        AND NAME = ''file_name''
                        )
                )
            ) --поля
    BEGIN
        INSERT INTO ' + @table_name + ' (
            file_path
            ,file_type
            ,file_name
            )
        VALUES (
            ''' + isnull(@file_path, '') + '''
            ,''' + isnull(@file_type, '') + '''
            ,''' + isnull(@file_name, '') + '''
            )
    END';

    EXEC (@sql);
END
...