如果列存在,则使用列值

时间:2017-07-07 08:55:41

标签: sql sql-server-2008-r2

如果列存在,我试图从列中选择值。

此表正在进行一些修改,删除了一些列,并将值提取到另一个表中。

我正在使用的查询在下面。在这个阶段,列可以显示或可能已经删除,所以我正在进行列检查

IF COL_LENGTH('MyTableName', 'MyColumnName') IS NOT NULL
BEGIN
    INSERT INTO SOMETABLE VALUES(TITLE,TYPEID)
    SELECT DISTINCT MyColumnName,2
    FROM MyTableName
END 

也试过

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'MyColumnName'
          AND Object_ID = Object_ID(N'dbo.MyTableName'))
BEGIN
    INSERT INTO SOMETABLE VALUES(TITLE,TYPEID)
    SELECT DISTINCT MyColumnName,2
    FROM MyTableName
END

但即使列存在,也会在删除列时给出错误检查

无效的列名称“MyColumnName”

有没有办法绕过这个

2 个答案:

答案 0 :(得分:2)

我怀疑在编译查询期间发生了错误。编译器不会考虑IF语句,它会评估整个查询,就好像要执行所有操作一样。遇到不存在的列时,无论您是否检查是否存在,都会收到错误。我认为最好的解决方案是使用动态SQL来解决这个问题。

类似的东西:

IF COL_LENGTH('MyTableName', 'MyColumnName') IS NOT NULL
BEGIN
    EXEC sys.sp_executesql N'INSERT INTO SOMETABLE VALUES(TITLE,TYPEID)
                             SELECT DISTINCT MyColumnName,2
                             FROM MyTableName'
END

答案 1 :(得分:0)

尝试:

IF EXISTS(SELECT 1 FROM sys.columns 
          WHERE Name = N'MyColumnName'
          AND Object_ID = Object_ID(N'dbo.MyTableName'))
BEGIN
    INSERT INTO SOMETABLE VALUES(TITLE,TYPEID)
    SELECT DISTINCT MyColumnName,2
    FROM MyTableName
END