22

由于同一个表的不同版本,我需要执行一个 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

任何解决方法?

4

4 回答 4

11

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)
于 2013-08-21T09:13:25.410 回答
4

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

例如:

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

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

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

于 2013-08-21T09:22:17.513 回答
2

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

于 2013-08-21T09:48:21.913 回答
0
    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

-希望能帮助到你 。

于 2013-08-21T09:45:16.117 回答