SQL Insert зависит от наличия столбца

Мне нужно сделать один INSERT или другой в зависимости от того, существует ли столбец из-за разных версий одной и той же таблицы.

Я использовал подход этот поток, но предварительная проверка SQL Server или "сортировка компиляции" обнаруживает ошибку, которая не будет работать во время выполнения.

Здесь некоторый код

IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
BEGIN

INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
SELECT value1, value2, value3, value4

END ELSE
BEGIN

INSERT INTO [dbo].[TableA]([Column1], [Column3], [Column4])
SELECT value1, value3, value4

END

Любое обходное решение?

Ответы

Ответ 1

SQL будет знать, что столбец не существует, поэтому он не позволит вам запустить запрос. Решением будет выполнение динамического запроса.

DECLARE @value1 AS VARCHAR(50)
DECLARE @value2 AS VARCHAR(50)
DECLARE @value3 AS VARCHAR(50)
DECLARE @value4 AS VARCHAR(50)

SET @value1 = 'somevalue1'
SET @value2 = 'somevalue2'
SET @value3 = 'somevalue3'
SET @value4 = 'somevalue4'

DECLARE @SQL AS VARCHAR(MAX)

IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
    BEGIN

        SET @SQL = 
            'INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
            SELECT ' + @value1 + ', ' + @value2 + ', ' + @value3 + ', ' + @value4 
    END 
ELSE
    BEGIN

        SET @SQL = 
            'INSERT INTO [dbo].[TableA]([Column1], [Column3], [Column4])
            SELECT ' + @value1 + ', ' + @value3 + ', ' + @value4 
    END

EXEC(@SQL)

Ответ 2

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

например:

create proc TableAInsert
(
     @col1 int,
     @col2 int,
     @col3 int,
     @col4 int
)

Таким образом вы создаете определение interface для вашей базы данных.

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

Ответ 3

Проверьте, существует ли Column2 из таблицы A с помощью INFORMATION_SCHEMA.COLUMNS и используйте в исходном запросе для переключения между двумя вставками

Ответ 4

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'TABLEA' AND COLUMN_NAME = 'COLUMNNAME')
       BEGIN
    IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
       BEGIN
    INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
    SELECT value1, value2, value3, value4

Сначала проверьте, существует ли столбец или нет, чем go, проверьте его длину. Однако я не вижу ничего плохого в проверке COL_LENGTH.

-Убедитесь, что это помогает.