2017-04-07 3 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! 
        "; 

을하지만 지금은 (5 월/수도 없습니다) 기존의 열 때인 이것을에 추가 할.

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. 가 함께 일하고있는 DB의 버전을 확인 :에

    앱이 필요합니다.

  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

네, 고마워요! 나는 지금 이와 비슷한 것을 해왔다.하지만 좀 더 우아한 방법 (한 줄짜리 코드 솔루션)을 찾고 있었다. –