关于sql server:SQL Insert取决于列是否存在

SQL Insert depending if a column exists

我需要进行一次或另一次插入,这取决于同一个表的不同版本是否存在列。

我在这个线程上使用了这种方法,但SQL Server的预检查或"排序编译"检测到一个错误,该错误在执行期间不会失败。

这是一些密码

1
2
3
4
5
6
7
8
9
10
11
12
13
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

有什么解决办法吗?


SQL将知道该列不存在,因此它不会让您运行查询。解决方案是执行动态查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)


我将创建具有公共签名的存储过程,并将适当的版本添加到数据库的各个版本中,而不是动态地进行处理。

如:

1
2
3
4
5
6
7
CREATE proc TableAInsert
(
     @col1 INT,
     @col2 INT,
     @col3 INT,
     @col4 INT
)

以这种方式,您可以为数据库创建一个interface定义。

如果数据库再次更改,则可以使用带有默认值的可选参数创建此过程的新版本,并以与以前相同的方式继续调用它。


使用INFORMATION_SCHEMA.COLUMNS检查表A的第2列是否存在,并在原始查询中使用该列在两个插入之间切换


1
2
3
4
5
6
7
    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

首先检查列是否存在,然后检查其长度。不过,我认为COL_LENGTH检查没有任何错误。

-希望有帮助。