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

时间:2016-06-02 15:51:58

标签: sql-server sql-server-2005 vbscript common-table-expression

我在新工作中处理一些传统技术。一切都是VBS或VBA,SQL Server 2005仍然至少运行1台服务器,2008年运行在另一台服务器上。我无法改变我必须使用的技术,所以请不要回答#34;只需使用PowerShell" ...这是我从微软论坛获得的全部内容。

我需要修改现有的VBScript来遍历表的记录,并为文档的每个页面分配页码。页码从1开始,每次位置文件夹更改时重置为1,由路径列中行的值定义。因此,我需要将当前行的路径与前一行的路径进行比较,以查看是否存在更改。

来自规格要求:

  

使用以下结构:

     
      
  • 最外面的文件夹= Box字段

         
        
    • 子文件夹=文件夹字段      
          
      • 内容中的文档均以" 0000001"      
            
        • 子文件夹=文件夹字段      
              
          • 内容中的文档均以" 0000001"
          • 开头   
        •   
      •   
    •   
    • 子文件夹=文件夹字段

           
          
      • 内容中的文档均以" 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中的用户输入中获取的变量 - 解释

前缀 - 迭代号码的可选文本前缀,即" SET" for" SET0000001"

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

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

sortfield - 要排序的表列,即表格的UID。

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

我的想法是,我只根据行的UID - 1加入新表的路径,然后是一个用于比较它们的案例陈述。如果不同,请重置页码。如果相同,继续正常。

Path is found in tblDoc. Look at UID in tblPage for the page numbering structure

谢谢!

1 个答案:

答案 0 :(得分:1)

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

尽管OVER功能的在线文档已标记为2008+,但它实际上在2005年工作得很好,正如原始发布的查询所证明的那样。这也意味着我可以通过使用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;