2009-11-19 5 views
0

저는 많은 다른 서버에서 실행되는 sproc을 가지고 있습니다. sproc에는 다음과 같은 select 문이 있습니다. 단지에 절은 그래서 본질적 1. 동일한 상태이 될 경우조건문 내부 A 절

select * 
from my_table 
where id = @my_id 
    and status in (1,3) 

그러나 데이터베이스 중 하나에 나는

select * 
from my_table 
where id = @my_id 
    and status in (1) 

정말 원하지 않는 ... 그 두 번째 부분이 필요합니다 실제 선택 명령문이 훨씬 길어서 그 시점에서 코드가 실제로 우아하지 않게 보이기 때문에 if db_name() = 'mydb' 문을 사용하십시오. where 절의 두 번째 부분을 db_name에서 조건부로 만들 수있는 방법이 있습니까?

도움 주셔서 감사합니다.

답변

0

이 시도 해당 지정된 단일 하나없는 데이터베이스의 상태 3S를 ... 원하는

Select ... 
    Where id = @my_id 
     And (status = 1 Or 
     (Db_Name() <> @DbName And status = 3)) 
1

조건부이기 때문에 정말 좋지 않습니다. 상태가 데이터베이스에 대한 1이면 당신이 원하는 원인 (I ... 난 당신의 논리 권리를 가지고 생각) ,하지만 : status IN (1, 3) 의미하는 경우

그래서, status = 1 or status = 3 ...

where id = @my_id 
    and 
     (
     status = 1 
     or 
     (db_name() <> 'mydb' and status = 3) 
     ) 
0

방법이

select * 
from dbo.MyTable 
where 1=1 
and 
    (DB_NAME() = 'FirstDatabase' and Status in (1)) 
OR 
    (DB_NAME() = 'SecondDatabase' and Status in (1, 3)) 
같은 약
0

조금 복잡하지만, DB_NAME()이 작동하는 경우 문제가 발생합니다.

SELECT * 
FROM my_table 
WHERE id = @my_id and (status in (1) or (DB_NAME() <> 'mydb' AND status = 3)) 
2

새 테이블을 작성 case 문

select * 
from my_table 
where id = @my_id 
and  status = CASE 
         WHEN db_name() = 'mydb' 
          THEN 1 
         WHEN db_name() = 'other' 
          THEN 3 
         ELSE -1 
        END 
1

를 사용할 수 있습니다.

select my_table.* 
from my_table 
inner join my_valid_statuses on my_table.status = my_valid_statuses.status 
where my_table.id = @my_id 

그런 다음 my_valid_statuses이 각 데이터베이스에 적절하게 채워 졌는지 확인하십시오.