gpt4 book ai didi

sql-server - Transact SQL 跳过 GOTO 或 IF ELSE 当链接服务器在代码中时

转载 作者:行者123 更新时间:2023-12-03 11:33:58 27 4
gpt4 key购买 nike

我正在尝试解决一个问题,“如果服务器不可用,则不执行 oracle 查询”,脚本会检查 LINKED 服务器 ORACLE 是否可用,并使用如下结果更新 SQL Server;

declare @srvr nvarchar(128), @retval int;
set @srvr = 'ORA_SVC';
begin try
exec @retval = sys.sp_testlinkedserver @srvr;
end try
begin catch
set @retval = sign(@@error);
end catch;
if @retval = 1 Update ORACLE_AVAIL set AVAILABLE = 0
if @retval = 0 Update ORACLE_AVAIL set AVAILABLE = 1
go

所以...上面的代码效果很好!如果我通过修改 TNSNames.ORA 文件终止 ORACLE 连接...等到 SQL 服务器刷新它的连接,上面的代码找不到链接服务器并更新数据库,所以我们在这里很好。

在上面的 GO 之后是这段代码和我的问题。

DECLARE @ORACLE_ACTIVE BIT
set @ORACLE_ACTIVE = (select AVAILABLE from ORACLE_AVAIL)

if @ORACLE_ACTIVE = 1 GOTO ORACLE_IS_DOWN

INSERT into MY_SQL_SERVER_TABLE (COLUMN1,COLUMN2,COLUMN3)
select COLUMN1,COLUMN2,COLUMN3 from ORA_SVC..ORA_SVC.ORACLE_TABLE

ORACLE_IS_DOWN:

如果 Oracle 服务器离线,我的脚本的上述部分将失败,无论 @Oracle_Avail If 语句如何。

如果我修改代码为;

DECLARE @ORACLE_ACTIVE BIT
set @ORACLE_ACTIVE = (select AVAILABLE from ORACLE_AVAIL)

if @ORACLE_ACTIVE = 1 GOTO ORACLE_IS_DOWN

PRINT 'GOTO DIDNT WORK'

ORACLE_IS_DOWN:

Print 语句按预期被忽略。如果@ORACLE_ACTIVE = 1 即是。

GOTO 不好,我明白了。如果链接服务器不存在(TNSNames.ora 文件指向无效主机),IF ELSE 在这里也不起作用,无论 if @ORACLE_ACTIVE 检查如何,脚本都会失败。

感谢您的宝贵时间。我真的希望我的措辞是正确的,因为我没有通过搜索引擎找到解决方案

最佳答案

我的猜测是,在解析期间,SQL Server 会尝试验证您的查询。也许它正在尝试查看这些列是否存在。

您可以通过将查询移动到内部范围来延迟解析:

exec N'INSERT into MY_SQL_SERVER_TABLE (COLUMN1,COLUMN2,COLUMN3)
select COLUMN1,COLUMN2,COLUMN3 from ORA_SVC..ORA_SVC.ORACLE_TABLE'

关于sql-server - Transact SQL 跳过 GOTO 或 IF ELSE 当链接服务器在代码中时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25294606/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com