sql-server - 处理 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:
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';
推荐阅读
- java - 当我打开 intelij idea 时,Java 崩溃了
- mysql - MySQL 服务器已消失 XAMPP
- html - 4 列 Flexbox-Layout 在任何浏览器上都可以很好地工作,除了 IE,它只在一行中显示 3 列
- macos - 将我的水晶可执行文件使用的 .dylib 文件放在哪里?
- react-native - 如何在两个背景视图之间实现浮动徽标布局?
- javascript - Ipify 被 Cors 阻止。我怎样才能让它被允许?
- c# - GetDC 获得的绘图在循环内不起作用
- java - 如何在 JavaFX LineChart 中的 NumberAxis 上保持相等的 x 和 y 长度?
- typescript - TypeScript 条件类型抱怨类型不可分配
- java - 在 Spring Boot 中没有常规 Web 应用程序的基于 HTTP 的执行器