2017-04-07 31 views
0

在某些客户我使用旧数据库,但现在我必须为新客户添加另一列。我的程序现在应该查询新列,如果它存在,并使用NULL,如果它不存在。SQL - 如果OLEQuery中存在选择列

使用C#和OLEQuery这是工作迄今:

string sql = @"SELECT i.[ID] AS cID, 
         pg.[Name], 
         pg.[ID] AS pgid, 
         i.[time], 
         defect = CASE i.[defect] WHEN 0 THEN 'OK' WHEN 1 THEN 'NOK' END,           
        FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
        WHERE i.[time] BETWEEN ... ///SOME MORE CODE IS FOLLOWING HERE! 
        "; 

但现在我想加入到这个(可以/不可以)现有列timeTo。

string sql = @"SELECT i.[ID] AS cID, 
         pg.[Name], 
         pg.[ID] AS pgid, 
         i.[time], 
         defect = CASE i.[defect] WHEN 0 THEN 'OK' WHEN 1 THEN 'NOK' END,      
         timeTo = CASE i.[timeTo] WHEN EXISTS THEN i.[timeTo] ELSE NULL END      
        FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
        WHERE i.[time] BETWEEN ... //SOME MORE CODE IS FOLLOWING HERE! 
        "; 

我知道使用这个“存在”关键字很困难,但是有没有“单行”解决方案?我发现了其他几种案例选择解决方案由于我需要在具有不同列的几个地方使用此解决方案,因此案例选择解决方案不适合。 感谢您的帮助

+0

您使用哪种rdbms?例如sql-server,mysql或其他东西? – BeanFrog

+0

对不起,它是sql-server。 –

+0

“存在”,你的意思是不是'null'? – JohnHC

回答

1

SQL Server不会允许您引用不存在的字段。我怀疑这是因为查询优化器无法生成包含不存在的字段的执行计划。

您的应用程序将需要:

  1. 识别它正在与该数据库的版本。
  2. 选择适当的查询。
  3. 确保它处理丢失的数据(通过关闭依赖新字段的功能或通过选择适当的默认值)。
0

您可以执行if语句并查询系统表。你需要在动态sql中进行解析。

declare @sql nvarchar(max); 

if exists (
    select 1 from sys.columns c 
    inner join sys.tables t on c.object_id = t.object_id 
    where c.name = 'timeTo' and t.name = 'inspection') 
begin 
    set @sql = 'SELECT i.[ID] AS cID, 
     pg.[Name], 
     pg.[ID] AS pgid, 
     i.[time], 
     defect = CASE i.[defect] WHEN 0 THEN ''OK'' WHEN 1 THEN ''NOK'' END,      
     timeTo = CASE i.[timeTo] WHEN EXISTS THEN i.[timeTo] ELSE NULL END      
    FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
    WHERE i.[time] BETWEEN ... //SOME MORE CODE IS FOLLOWING HERE!'; 
end 
else 
begin 
    set @sql = 'SELECT i.[ID] AS cID, 
     pg.[Name], 
     pg.[ID] AS pgid, 
     i.[time], 
     defect = CASE i.[defect] WHEN 0 THEN ''OK'' WHEN 1 THEN ''NOK'' END,           
    FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
    WHERE i.[time] BETWEEN ... ///SOME MORE CODE IS FOLLOWING HERE!'; 
end 
exec (@sql); 
+0

是的,谢谢!我现在做了这样的事情 - 但我希望/寻找更优雅的方式(单行代码解决方案)。 –