2009-11-19 132 views
0

我有一个运行在许多不同服务器上的sproc。在存储过程中,我有一个如下所示的select语句。条款声明内部条款

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

然而,对于数据库之一,我需要的是第二部分where子句仅是状态等于1,所以基本上...

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

我真的不想给我们一个if db_name() = 'mydb'声明,因为实际的select语句要长得多,并且代码在这一点上开始显得非常不雅。有没有办法让db_name的where子句的第二部分有条件?

感谢您的帮助。

回答

0

试试这个只希望对于那些不是单个指定一个数据库的状态3秒......

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

这将是不雅,真的,因为它是有条件的。因为你想,如果状态为1的任何数据库(我觉得我得到了你的逻辑吧...) ,但:

所以,如果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在每个数据库适当填充。