SQL插入取决于列是不是存在

Posted

技术标签:

【中文标题】SQL插入取决于列是不是存在【英文标题】:SQL Insert depending if a column existsSQL插入取决于列是否存在 【发布时间】:2013-08-23 14:03:00 【问题描述】:

由于同一个表的不同版本,我需要执行一个 INSERT 或另一个,具体取决于列是否存在。

我在this thread 处执行了该方法,但 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

有什么解决方法吗?

【问题讨论】:

你从哪里得到你的价值观?是不是一些参数,比如@value1...? @framara 奇怪的案例我尝试使用相同的代码但它的工作,但是你可以先检查列是否存在而不是列长度。 【参考方案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)

【讨论】:

我终于使用了 EXEX('INSERT... ') 和转义单引号。谢谢! 小心 SQL 注入。【参考方案2】:

我会创建具有公共签名的存储过程,而不是动态处理此问题,并将适当的版本添加到您的各种版本的数据库中

例如:

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

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

如果你的数据库再次发生变化,你可以创建一个新版本的这个过程,带有一个带有默认值的可选参数,并像以前一样继续调用它。

【讨论】:

【参考方案3】:

使用 INFORMATION_SCHEMA.COLUMNS 检查 TableA 的 Column2 是否存在,并在原始查询中使用它在 2 个插入之间切换

【讨论】:

【参考方案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

首先检查列是否存在,然后再检查它的长度。 但是我在COL_LENGTH 的检查中没有发现任何问题。

-希望对您有所帮助。

【讨论】:

以上是关于SQL插入取决于列是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

SQL:插入更新主键相同的行的所有其他列

XQuery 更新:插入或替换取决于节点是不是存在不可能?

SQL:如果存在则更新,否则插入...但对于具有不同值的多行

SQL 插入到存在列的位置

SQL 插入之前怎么判断数据库已经存在

sql插入的列数不确定怎么办