不存在的列不应中断select中的sql查询

不存在的列不应中断select中的sql查询,sql,sql-server,Sql,Sql Server,在我的例子中,有不同的数据库版本(SQL Server)。例如,我的表orders在版本A中有列htmltext,但在版本B中缺少列htmltext Select [order_id], [order_date], [htmltext] from orders 我有一个巨大的(非常巨大的)语句,如果存在的话,访问htmltext列需要它 我知道,如果存在,我可以使用两个开始+结束区域执行条件。但这将非常难看,因为我的大型查询在整个SQL脚本(其中包含许多大型语句)中会出现两次 是否有可能选择该

在我的例子中,有不同的数据库版本(SQL Server)。例如,我的表
orders
在版本A中有列
htmltext
,但在版本B中缺少列
htmltext

Select [order_id], [order_date], [htmltext] from orders
我有一个巨大的(非常巨大的)语句,如果存在的话,访问
htmltext
列需要它

我知道,如果存在,我可以使用两个
开始+结束
区域执行
条件。但这将非常难看,因为我的大型查询在整个SQL脚本(其中包含许多大型语句)中会出现两次

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


谢谢大家!

为什么会缺少一列?肯定是被删除了。如果是,则删除过程必须已更新/修复依赖项

与其在破坏后修复它,不如在破坏任何东西之前通过采用一些协议来进行智能移动


IF Exists
是一种有助于保持查询运行的变通方法,但考虑到庞大的数据库和查询,这是一种开销

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

Create view vw_Table1 
AS
select * from <your Table>
Create view vw_Table1 
AS
select *,NULL as htmlText from <your Table>
创建视图vw_表1
作为
从中选择*
在htmlText不存在的版本中,将其创建为

Create view vw_Table1 
AS
select * from <your Table>
Create view vw_Table1 
AS
select *,NULL as htmlText from <your Table>
创建视图vw_表1
作为
从中选择*,空为htmlText
现在,在应用程序代码中,您可以安全地使用此视图而不是表本身,并且它的行为完全符合您的要求。

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

检查列是否存在:

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

有关详细信息:

否。SQL中查询的形状是固定的。它访问的列和表是固定的。它生成的列是固定的。如果你真的想沿着这条路线走下去,你应该看看动态SQL,在动态SQL中,你实际上建立了一个定制的查询作为一个庞大的字符串,然后执行它(因此,每次都是一个不同的查询,并且与我之前的评论不矛盾),甚至使用你建议的
If exists
else
方案,您必须将引用缺失列的查询包含在一个字符串中并单独执行它-T-SQL会尝试编译整个批处理,并由于缺失列而失败,甚至在它开始执行批处理并到达
if exists
test.good idea:)之前,我认为这是构建tsql查询的最佳方法。非常感谢。为什么要使用相同的应用程序代码访问不同的数据库版本?设法处理数据库中的每一个差异将是一项永恒的任务。