【问题标题】:I'm a little fuzzy on batch looping我对批处理循环有点模糊
【发布时间】:2015-07-30 02:53:29
【问题描述】:

我是编程新手,但我仍在努力探索某些实现循环的方法。

我有一个运行实验并收集数据的脚本。该脚本使用单个 int 值跟踪测试运行。所以我第一次运行脚本时,收集的数据将在 SQL 表中有一个名为 TestNum 的列,它以 1 开头。下次我运行它时,它将是 2,依此类推。现在的问题是,自从我开始这样做以来,我已经更新了脚本,并且我在一个循环中添加了一个以不同方式获取这个数字的循环,显然它没有经过深思熟虑,因为它只能通过抓取最后一个 TestNum 并添加 1

for /f "delims= " %%a in ('sqlcmd -S SERVER -d DATABASE -Q "SET NOCOUNT ON;
        SELECT MAX(TestNum)+1 FROM TABLE"') DO SET TestNum=%%a

最终我的问题归结为:如果我想实现一个循环,如果不存在 TestNum,则设置 TestNum = 1,否则实现上述循环,我知道我可以编写这样的伪代码

If TestNum from SQL Table is null
{
    (set TestNum variable in script = 1)
}
Else do (for /f "delims= " %%a in ('sqlcmd -S SERVER -d DATABASE -Q "SET NOCOUNT ON;
        SELECT MAX(TestNum)+1 FROM TABLE"') DO SET TestNum=%%a
        )

【问题讨论】:

  • 请在您的混合描述中如何区分 SQL 列 TestNum环境变量 TestNum?例如,您的伪代码指的是哪一个?以及所有其他事件?
  • 我为伪代码添加了一些基本描述。
  • TestNum 不仅仅是 IDENTITY column 有什么原因吗?
  • 最简单的原因?该表早于我在这里工作。

标签: sql-server loops batch-file for-loop


【解决方案1】:

我不明白为什么你不能在当前的实现中只使用Transact-SQL ISNULL function(或者,COALESCE):

for /f "delims= " %%a in (
  'sqlcmd -S SERVER -d DATABASE -Q "SET NOCOUNT ON; SELECT ISNULL(MAX(TestNum), 0) + 1 FROM TABLE"'
) DO SET TestNum=%%a

如果表为空,MAX(TestNum) 将评估为 NULL。 ISNULL(..., 0) 调用会将其变为 0,增量将返回 1。

如果表不为空,则脚本的工作方式与它已经工作的方式完全相同。

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 2017-06-15
    • 2019-01-26
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多