在执行时间内忽略SQL缺失列

时间:2014-07-10 16:41:29

标签: sql sql-server

我正在开发一个工具(使用c#winforms),它生成数据的SQL脚本,这些脚本独立于身份但却没有违反约束。在走过所有可能性的同时,我遇到了麻烦。我需要插入数据,考虑到一个列(允许为null)可能存在或不存在。 例如,作为VAL2的列存在于开发框中,但在prod框中可能存在也可能不存在。

CREATE TABLE TEMP ( COL1 VARCHAR(50) , VAL1  VARCHAR(50)) -- OPTIONAL/MAY EXISTS VAL2 VARCHAR(50)

IF EXISTS (SELECT TOP(1) COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TEMP' AND COLUMN_NAME = 'VAL2')
BEGIN
INSERT INTO TEMP (COL1,VAL1,VAL2) VALUES ('1','YES','NO')
INSERT INTO TEMP (COL1,VAL1,VAL2) VALUES ('2','NO','NO')
END
ELSE
BEGIN
INSERT INTO TEMP (COL1,VAL1) VALUES ('1','YES')
INSERT INTO TEMP (COL1,VAL1) VALUES ('2','NO')
END
GO

但是如果该列丢失了,即使它应该通过语法流过else,这种方法也会失败。

注意:我现在已经解决了这个问题,但是如果只是通过当前脚本创建,那么添加该列并将其删除。但问题是执行是通过有限的访问授权来规定CREATE / DROP语句的可能性。这可能是错误的,但这对我来说就是这样。

如果有任何替代方式,最好不要求添加此列,请指导我。

1 个答案:

答案 0 :(得分:0)

你必须使用动态sql来完成它:

CREATE TABLE TEMP
    (
      COL1 VARCHAR(50) ,
      VAL1 VARCHAR(50)
    )
 -- OPTIONAL/MAY EXISTS VAL2 VARCHAR(50)

IF EXISTS ( SELECT TOP ( 1 )
                    COLUMN_NAME
            FROM    INFORMATION_SCHEMA.COLUMNS
            WHERE   TABLE_NAME = 'TEMP'
                    AND COLUMN_NAME = 'VAL2' )
    BEGIN
        DECLARE @sql NVARCHAR(MAX)
        SELECT  @sql = 'INSERT INTO TEMP (COL1,VAL1,VAL2) VALUES (''1'',''YES'',''NO'')
INSERT INTO TEMP (COL1,VAL1,VAL2) VALUES (''2'',''NO'',''NO'')'
        EXEC sp_executesql @sql
    END
ELSE
    BEGIN
        INSERT  INTO TEMP
                ( COL1, VAL1 )
        VALUES  ( '1', 'YES' )
        INSERT  INTO TEMP
                ( COL1, VAL1 )
        VALUES  ( '2', 'NO' )
    END