我在新工作中处理一些传统技术。一切都是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加入新表的路径,然后是一个用于比较它们的案例陈述。如果不同,请重置页码。如果相同,继续正常。
谢谢!
答案 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;