在工作中,我们使用Windows批处理文件从计划工具中运行作业。这是一个古老的工具和方法,但它的工作原理。我必须使新工作适合现有技术。
对于这项特殊工作,我需要从文件夹中获取大量文件并将它们加载到SQL Server数据库表中。对于我加载的每一个,我需要运行一些SQL来更新最近填充的表。
所以我有一个for循环来查找文件夹中的文件。如果存在,我使用SQL服务器的BCP将数据加载到表中。然后我使用SQL服务器的SQLCMD来执行更新。
策略是使用BCP或SQLCMD将任何问题写入文件。接到电话后,我们会检查这些文件以确保没有出错。
处理单个文件时,这是相当简单的事情。事实证明,使用FOR循环是不可能的。
我设想调用一个子例程来设置一个变量,for循环中的代码可以检查,如果适当的话,优先退出。
我们在批处理文件中做的第一件事是将全局变量设置为0.当批处理作业将控制权返回给“调度程序”时,如果这不等于0,则作业显示为失败。
所以解释代码看起来像下面这样。
SET g_status=0
SET LOCAL EnableDelayedExpansion
FOR n = 1 to 12
IF FILE(n) EXISTS (
Execute BCP....
Execute SQLCMD....
CALL check_sql_status
IF !l_error_status! NEQ 0 ENDLOCAL & SET g_status=!l_error_status!
IF g_status NEQ 0 GOTO exit_gracefully
)
NEXT
.
.
GOTO END
REM ========
:check_sql_status
REM======
IF something is wrong (
SET l_error_status=123
GOTO EOF
REM ========
:exit_gracefully
REM======
ECHO g_status
:End
.
.
不要挂在上面的'代码'上。它只是我尝试将局部变量传递回我感兴趣的全局变量的位。无论我尝试什么,我都无法使全局变量接受子例程中设置的值。
我会尝试找到这个问题并在我恢复工作时发布一些实际代码,尽管BCP和SQLCMD使用了许多可能只是混淆而不是帮助的参数。