元芳,你怎么看? if不成立,却执行了第一个条件,导致报错......

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



if '0005'='0008'
begin

select 1

end

else if '0009'='0008'
begin

select 2

end

else
begin

select 3

end






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
...全文
254 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xb12369 2012-10-25
  • 打赏
  • 举报
回复
第一个if报错le,它再怎么往下走啊?

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

快溜 2012-10-25
  • 打赏
  • 举报
回复
select 1/0 编译是没有问题的
以学习为目的 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 ssp2009 的回复:

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

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

if '0005'='0008'
begin

select 1/0

end

else if '0009'='0008'
begin

select 2/'a'

……
[/Quote]我测试的是直接执行第三个if条件后的查询啊,按照一楼的说法,是不是SQL编译,先不管分支,首先判断SQL是不是可以执行,那应该会报错 遇到零被除的错误 。但是没有报错直接执行第三个条件后的查询了
开启时代 2012-10-25
  • 打赏
  • 举报
回复
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)
汤姆克鲁斯 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ssp2009 的回复:]

sql编译,不管你的分支判断,首先会检查你的sql是否可以执行,这就是编译性语言与解释性语言的区别。
[/Quote]
如果这么解释
那么下面的编译这么不会有问题呢

if '0005'='0008'
begin

select 1/0

end

else if '0009'='0008'
begin

select 2/'a'

end

else
begin

select 3

end
汤姆克鲁斯 2012-10-25
  • 打赏
  • 举报
回复
上个帖子回复你了,确实存在楼主说的这个问题,很纳闷

openrowset opendatasource 之类的是用于临时性的访问OLE DB 数据源的方法
如果你这个是长期使用建议见个连接服务器
你测试一下链接服务器会不会出这种情况
dusttosky 2012-10-25
  • 打赏
  • 举报
回复
真是这样的结果。。。。那我可悲了。

不能保证我每一台服务器都时刻开机。。。

有办法解决吗?
快溜 2012-10-25
  • 打赏
  • 举报
回复
sql编译,不管你的分支判断,首先会检查你的sql是否可以执行,这就是编译性语言与解释性语言的区别。
SQL77 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
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'

e……
[/Quote]
这样的办法就挺好。
这样的话库那些都可以动态传参数,不好么。
汤姆克鲁斯 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

refer to
http://beyondrelational.com/modules/24/syndicated/509/posts/12810/testing-the-linked-server-connectivity-from-sql-server-2005.aspx

SQL code
DECLARE @SQL VARCHAR(MAX)
if '0005'='0008'
……
[/Quote]
哈哈 大叔 v587
nzperfect 2012-10-25
  • 打赏
  • 举报
回复
refer to
http://beyondrelational.com/modules/24/syndicated/509/posts/12810/testing-the-linked-server-connectivity-from-sql-server-2005.aspx

DECLARE @SQL VARCHAR(MAX)
if '0005'='0008'
begin
EXEC('
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
EXEC('
select xm,bj,km
from opendatasource(
''sqloledb'',
''data source=192.168.1.99;User ID=sa;Password=hhdsql1''
).my.dbo.tb1 ')
end

else
begin
EXEC('
select xm,bj,km
from opendatasource(
''sqloledb'',
''data source=192.168.1.97;User ID=sa;Password=hhdsql3''
).my.dbo.tb1')
end
nzperfect 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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;Pa……
[/Quote]

这种赋变量的方法是可行的。
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

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

编译只看你有没有语法问题吧 这个语句是不存在任何语法问题的 所以便已是不会把错的 但是执行的话是不符合逻辑的
茫茫前路 2012-10-25
  • 打赏
  • 举报
回复
关注,学习下!
以学习为目的 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

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

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧