2

就我而言,有不同的数据库版本(SQL Server)。例如,我的表在版本 A 中orders确实有该列htmltext,但在版本 Bhtmltext中缺少该列。

Select [order_id], [order_date], [htmltext] from orders

我有一个巨大的(非常巨大的声明),htmltext如果存在的话,它是访问 column 所必需的。

我知道,我可以在if exists两个方面做一个条件begin + end。但这会非常难看,因为我的巨大查询将在我的整个 SQL 脚本中出现两次(其中包含很多巨​​大的语句)。

是否有可能选择该列 - 但如果该列不存在,它仍将被忽略(或设置为“null”)而不是引发错误(类似于 isnull() 函数)?

谢谢!

4

3 回答 3

5

在两个版本中创建一个视图..

在列 htmltext 存在的版本中,然后将其创建为

Create view vw_Table1 
AS
select * from <your Table>

在 htmlText 不存在的版本中,然后将其创建为

Create view vw_Table1 
AS
select *,NULL as htmlText from <your Table>

现在,在您的应用程序代码中,您可以安全地使用此视图而不是表本身,它的行为完全符合您的要求。

于 2013-06-28T07:18:50.673 回答
2

首先为什么会丢失一列?肯定它在某个地方被删除了。如果是这样,则删除过程必须已更新/修复了依赖项。

与其在破坏后修复它,不如在破坏任何东西之前通过采用一些协议来做聪明的举动。

IF Exists是一种解决方法,可以帮助保持查询运行,但考虑到您庞大的数据库和查询,这是一种开销

于 2013-06-28T07:13:09.520 回答
1

解决此问题的“最佳”方法是检查该列是否存在于您的数据库中,并根据该信息动态构建您的 SQL 查询。我怀疑是否有更合适的方法来做到这一点。

检查列是否存在:

SELECT * 
FROM   sys.columns 
WHERE  Name = N'columnName' 
AND    Object_ID = Object_ID(N'tableName');

有关详细信息:SQL Server 中的动态 SQL 语句

于 2013-06-28T07:25:39.880 回答