VBScript 和 SQL Server 2005 将当前行与上一行进行比较

VBScript and SQL Server 2005 compare current row to previous row

我在新工作中处理一些遗留技术。一切都是 VBS 或 VBA 和 SQL Server 2005 仍然 运行ning 至少有一台服务器,2008 在另一台服务器上。我不能改变我必须使用的技术,所以请不要用 "Just use PowerShell" 来回应……这是我从 Microsoft 论坛上得到的全部信息。

我需要修改现有的 VBScript 以遍历 table 的记录并为文档的每一页指定一个页码。页码从 1 开始,并在每次位置文件夹更改时重置为 1,如路径列中的行值所定义。所以我需要比较当前行的路径和前一行的路径,看看是否有变化。

来自规格要求:

Use the following structure:

  • Outermost folder = Box field

    • Sub-folder = File Folder field
      • Docs within will each begin at "0000001"
        • Sub-folder = File Folder field
          • Docs within will each begin at "0000001"
    • Sub-folder = File Folder field

      • Docs within will each begin at "0000001"

这是一个非常简单但有效的 Excel 脚本,不幸的是我必须使用 VBScript 这样第三方软件就可以 运行 该脚本:

=IF  "Folder field in this row" = "Folder field in row above"
True = "above column" (beg doc of previous doc) + "pgcount of previous doc"
False = "1"

这是 VBScript 中现有的 SQL 语句(抱歉命名约定 - 这不是我的选择):

UPDATE tblpage 
SET tblpage.UID = newtable.keyid 
FROM tblpage inner join (SELECT PKEY, '" & prefix & "' + REPLICATE(0, " & padnum & " -
LEN(convert(varchar(" & padnum & "),(" & startnum & " + rank() OVER (ORDER
BY TBLDOC." & sortfield & ") + Page - 2)))) + CONVERT(nvarchar(" & padnum &
"), convert(varchar(" & padnum & "),(" & startnum & " + rank() 
OVER (ORDER BY TBLDOC." & sortfield & ") + Page - 2))) AS keyid 
FROM tblpage 
inner join tbldoc on tblpage.id = tbldoc.id) as newtable ON newtable.pkey = tblpage.pkey;

从 VBScript 中的用户输入中获取的变量 - 解释

prefix - 迭代数字的可选文本前缀,即 "SET" for "SET0000001"

padnum - 迭代开始前 0 的数量,即 "SET0000001"

的“000000”

startnum - 迭代的起始编号,即 "SET0000001"

中的“1”

sortfield - 要排序的 table 列,即 table 的 UID。

上面的 SQL 正确地进行了迭代,但没有在新文件夹上重置。我一直在研究SQL SERVER – How to Access the Previous Row and Next Row value in SELECT statement? – Part 2,但我仍然很困惑。

我的想法是,我根据行的 UID - 1 将路径加入到新 table 中,然后加入一个 case 语句来比较它们。如果不同,重新设置页码。如果一样,照常继续。

谢谢!!

这个答案来自我以前的 CS 大学室友,但他没有 Stack 帐户(!?)所以我会 post 帮他...

尽管 OVER 函数的在线文档标记为 2008+,但它实际上在 2005 年工作得很好,原始 posted 查询证明了这一点。这也意味着我可以通过使用 PARTITION BY 在所选列 Path

上重置来绕过将前一行与当前行进行比较的所有麻烦
UPDATE tblpage 
SET tblpage.UID = newtable.keyid 
FROM tblpage inner join (SELECT PKEY, '" & prefix & "' + REPLICATE(0, " & padnum & " -
LEN(convert(varchar(" & padnum & "),(" & startnum & " + rank() OVER (
PARTITION BY TBLDOC.Path ORDER
    BY TBLDOC." & sortfield & ") + Page - 2)))) + CONVERT(nvarchar(" & padnum &
    "), convert(varchar(" & padnum & "),(" & startnum & " + rank() 
    OVER (PARTITION BY TBLDOC.Path ORDER BY TBLDOC." & sortfield & ") + Page - 2))) AS keyid 
    FROM tblpage 
    inner join tbldoc on tblpage.id = tbldoc.id) as newtable ON newtable.pkey = tblpage.pkey;