Sql 笨拙的DAO字符串操作问题

Sql 笨拙的DAO字符串操作问题,sql,ms-access,dao,Sql,Ms Access,Dao,我正在使用一个遗留的vb6产品,遇到了一个问题,需要通过DAO从数据库表获取完整路径的文件名部分。我在这里没有访问VBA函数的权限,所以我专门寻找MS access SQL。我无法在查询之后删除一些额外的代码。除非修改SQL,否则我无法更改/重构解决方案 现在,DAO没有任何instrrev或replace功能,所以我非常有限 有人猜测吗? 提前感谢。我以前做过很多DAO编程,但那是10-15年前的事了 您可以将DAO更改为调用Access QueryDef,然后在那里进行修复吗?您应该能够使用

我正在使用一个遗留的vb6产品,遇到了一个问题,需要通过DAO从数据库表获取完整路径的文件名部分。我在这里没有访问VBA函数的权限,所以我专门寻找MS access SQL。我无法在查询之后删除一些额外的代码。除非修改SQL,否则我无法更改/重构解决方案

现在,DAO没有任何
instrrev
replace
功能,所以我非常有限

有人猜测吗?
提前感谢。

我以前做过很多DAO编程,但那是10-15年前的事了


您可以将DAO更改为调用Access QueryDef,然后在那里进行修复吗?

您应该能够使用内置的vba函数,如
instr
replace
mid


有一种“沙盒”模式可能会阻止它们-请参阅本节,了解如何取消阻止它们,假设您无法更改实际数据库

我能想到的唯一一件事(这件事让我绞尽脑汁,对不起,伙计)就是重复调用instr,嵌套在iif语句中,例如,替换对inStrRev的调用

SELECT IIf(InStr([FileName],""\"")>0,Mid$([Filename],InStrRev([Filename],""\"")+1),[Filename]) FROM Table1
你会完全疯掉的

SELECT IIf(InStr([FileName],""\"")>0,Mid$([Filename],iif(InStr(1, [FileName], ""\"") > 0, iif(InStr(2, [FileName], ""\"") > 0, iif(InStr(3, [FileName], ""\"") > 0, iif(InStr(4, [FileName], ""\"") > 0, iif(InStr(5, [FileName], ""\"") > 0, iif(InStr(6, [FileName], ""\"") > 0, iif(InStr(7, [FileName], ""\"") > 0, iif(InStr(8, [FileName], ""\"") > 0, iif(InStr(9, [FileName], ""\"") > 0, 1, InStr(9, [FileName], ""\"")), InStr(8, [FileName], ""\"")), InStr(7, [FileName], ""\"")), InStr(6, [FileName], ""\"")), InStr(5, [FileName], ""\"")), InStr(4, [FileName], ""\"")), InStr(3, [FileName], ""\"")), InStr(2, [FileName], ""\"")), InStr(1, [FileName], ""\""))),[Filename]) from table1
这将适用于10个子文件夹左右深的路径。 如果您认为10个子文件夹太少,我有一点vba来生成您所需的语句深度

Function BuildNestedIIfs(ByVal depth As Integer, byval maxDepth as integer) As String
    Dim locator As String
    If depth < maxDepth Then
        locator = "InStr(" & depth & ", [FileName], """"\"""")"
        Build = "iif(" & locator & " > 0, " & Build(depth + 1, maxDepth) & ", " & locator & ")"
    Else
       Build = "0"
    End If
End Function
函数buildnestediFS(ByVal depth为整数,ByVal maxDepth为整数)为字符串
作为字符串的Dim定位器
如果深度<最大深度,则
locator=“InStr(&depth&),[FileName],”“\”“”
Build=“iif(“&locator&”>0,&Build(depth+1,maxDepth)&“,”&locator&“)
其他的
Build=“0”
如果结束
端函数

这是淫秽的,但应该可以工作

很好尝试,但我在NetworkService下运行,因此我没有注册表权限,这是一个支持问题,因此目前在InstallShield中我无能为力。好主意,对不起,伙计,不要掷骰子。我在使用querydfs时也遇到同样的问题。很好的尝试,怎么可能呢?虽然已经有一段时间了,但我确信QueryDefs可以使用accessbasicfunctions.lol。是的,淫秽这个词。如果我能给你1+以上,我会感谢你有宪法来写这篇文章!我曾认为这是一个解决办法,但这只是胡说八道。现在,所有这些都作为服务包版本的代码更改被抛出,所以我们不需要做这种事情。干得好,伙计,谢谢费克!我曾经遇到过这样的情况:像上面这样令人厌恶的事情是唯一的解决办法,或者现在需要解决某个问题。我很高兴那些嵌套的IIf将永远见不到曙光。最好的luck@Binary担忧者:我的第一个直觉也是编写一组嵌套的IIf()并用它们替换InStrRev()。但我对这种丑陋和有限的想法不屑一顾+感谢你的努力:D