首页 > 解决方案 > 处理 SQL Server 表中的缺失列

问题描述

我们有大量的数据库,都有 table MyTable,但是在一些数据库中有一个名为 的列MyTable.MyCol1,而在一些没有。

我正在尝试SELECT为表构建一个,它可以针对任何数据库运行。所以我需要一个如果MyCol1不存在就不会出错的查询。

在我看来,这应该很容易,但似乎并不容易。

我不能更改数据库或创建视图,所以我需要在一个普通的 SQL 脚本中处理它。

DECLARE @MyCol1Len INT = COL_LENGTH('MyTable', 'MyCol1');

IF @MyCol1Len IS NULL
    PRINT 'Columns do not exist'
ELSE
    PRINT 'Columns exist'

这有效,并打印了正确的文本,但是当我切换SELECT语句的文本时,如下所示:

DECLARE @MyCol1Len INT = COL_LENGTH('MyTable', 'MyCol1');

IF @MyCol1Len IS NULL
    PRINT 'Columns do not exist'
ELSE
    SELECT MyCol1 FROM MyTable

我收到一个错误: Invalid column name 'MyCol1'.

我如何有一个 SQL 脚本来处理列可能不存在的事实,如果不存在,则只返回其他内容(例如空字符串)..?

标签: sql-server

解决方案


您必须在此处使用动态 SQL:

IF EXISTS(SELECT 1
          FROM sys.schemas s
               JOIN sys.tables t ON s.schema_id = t.schema_id
               JOIN sys.columns c ON t.object_id = c.object_id
          WHERE s.[name] = N'dbo'
            AND t.[name] = N'MyTable'
            AND c.[name] = N'MyCol1') 
    EXEC sys.sp_executesql N'SELECT MyCol1 FROM dbo.MyTable;';
ELSE
    PRINT N'Column do not exist';

推荐阅读