日期:2014-05-17  浏览次数:20598 次

元芳,你怎么看? if不成立,却执行了第一个条件,导致报错......
我测试很多次了,下面第一个sql执行是执行最后一个,没问题我知道。但是第二个不行。
先了解我的情况:局域网,有多台sql数据服务器,我想在其中的一台,执行通过判断条件,执行不同的sql查询语句(如第二个)。 请问,就算我第二个sql的中前面2个数据库没开机,(最后一个else的数据库肯定正常),但是只要我条件不成立,是否应该直接执行最后一个条件? 很多人说是, 但是,实验却不行,直接在第一个条件执行,报错了,说第一个条件数据库不存在。 不信的话,建议可以用自己sql测试做最后一个条件测试一下。。。。。 求高人解答。 谢谢!


SQL code

if '0005'='0008'
begin

select 1

end

else if '0009'='0008'
begin

select 2

end

else 
begin

select 3

end






SQL code

if '0005'='0008'
begin

select xm,bj,km
          from opendatasource(
               'sqloledb',
               'data source=192.168.1.99;User ID=sa;Password=hhdsql1'
).my.dbo.tb1 

end

else if '0009'='0008'
begin

select xm,bj,km
          from opendatasource(
               'sqloledb',
               'data source=192.168.1.98;User ID=sa;Password=hhdsql2'
).my.dbo.tb1 

end

else 
begin

select xm,bj,km
          from opendatasource(
               'sqloledb',
               'data source=192.168.1.97;User ID=sa;Password=hhdsql3'
).my.dbo.tb1 

end



------解决方案--------------------
sql编译,不管你的分支判断,首先会检查你的sql是否可以执行,这就是编译性语言与解释性语言的区别。
------解决方案--------------------
上个帖子回复你了,确实存在楼主说的这个问题,很纳闷

openrowset opendatasource 之类的是用于临时性的访问OLE DB 数据源的方法
如果你这个是长期使用建议见个连接服务器
你测试一下链接服务器会不会出这种情况
------解决方案--------------------
探讨

sql编译,不管你的分支判断,首先会检查你的sql是否可以执行,这就是编译性语言与解释性语言的区别。

------解决方案--------------------
declare @sql varchar(500)
if '0005'='0008'
begin

set @sql='select xm,bj,km
from opendatasource(
''sqloledb'',
''data source=192.168.1.99;User ID=sa;Password=hhdsql1''
).my.dbo.tb1'

end

else if '0009'='0008'
begin


set @sql='select xm,bj,km
from opendatasource(
''sqloledb'',
''data source=192.168.1.98;User ID=sa;Password=hhdsql2''
).my.dbo.tb1'


end

else 
begin

set @sql='select xm,bj,km
from opendatasource(
''sqloledb'',
''data source=192.168.1.97;User ID=sa;Password=hhdsql3''
).my.dbo.tb1'

end

exec(@sql)
------解决方案--------------------
探讨

引用:

sql编译,不管你的分支判断,首先会检查你的sql是否可以执行,这就是编译性语言与解释性语言的区别。

如果这么解释
那么下面的编译这么不会有问题呢

if '0005'='0008'
begin

select 1/0

end

else if '0009'='0008'
begin

select 2/'a'

……

------解决方案--------------------
第一个if报错le,它再怎么往下走啊?

这又不是try 。。。catch 。。。 finaly。。。。


------解决方案--------------------
探讨

引用:

select 1/0 编译是没有问题的
此话当真?