【发布时间】:2011-05-14 02:21:11
【问题描述】:
我需要能够运行诸如
之类的查询SELECT * FROM atable WHERE MyFunc(afield) = "some text"
我在 VB 模块中编写了 MyFunc,但查询结果为“表达式中未定义函数 'MyFunc'”。从 .NET 执行时
根据我目前所读到的内容,由于安全问题,Access VB 模块中的功能在 .NET 中不可用。关于这个主题的信息不多,但这条途径似乎是一个死胡同。
另一种可能性是通过 CREATE PROCEDURE 语句,它也有宝贵的小文档:http://msdn.microsoft.com/en-us/library/bb177892%28v=office.12%29.aspx
以下代码确实有效,并在 Access 中创建了一个查询:
CREATE PROCEDURE test AS SELECT * FROM atable
但是,我需要的不仅仅是一个简单的选择语句——我需要几行 VB 代码。
在试验 CREATE PROCEDURE 语句时,我执行了以下代码:
CREATE PROCEDURE test AS
这产生了错误“无效的 SQL 语句;需要 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT' 或 'UPDATE'。”
这似乎表明有一个SQL'PROCEDURE'语句,所以我尝试了
CREATE PROCEDURE TEST AS PROCEDURE
这导致“PROCEDURE 子句中的语法错误”。
我找不到关于 SQL 'PROCEDURE' 语句的任何信息 - 也许我只是错误地阅读了错误消息,并且没有这样的野兽。我已经花了一些时间来试验这个语句,但我无法进一步了解。
针对添加字段来存储值的建议,我将扩展我的要求:
我有两种情况需要此功能。
在第一个场景中,我需要让用户能够搜索字段的 soundex,并且由于 Access 中没有 soundex SQL 函数,我添加了一个字段来存储用户想要的每个表中每个字段的 soundex 值能够搜索“听起来像”输入值的记录。每当父字段值更改时,我都会更新 soundex 值。这是相当多的开销,但我认为在这种情况下是必要的。
对于第二种情况,我想规范化字段值的空格连接的间距,并可选择去除用户定义的字符。结合使用 TRIM 和 REPLACE 函数,我可以非常接近于实现所需的值。仅当其中一个字段的值中的单词之间出现三个或更多空格时,该值才会有所不同(不太可能的情况)。很难证明需要此功能的每个表中每个字段的额外字段的开销是合理的。除非我从用户那里得到关于额外空格问题的具体反馈,否则我会坚持使用 TRIM & REPLACE 值。
我的应用程序与数据库无关(或者只是不太虔诚……我支持 7)。我为其他 6 个数据库中的每一个都编写了一个 UDF,它比内置数据库函数更有效地进行空间规范化和字符剥离。我可以在 Access 中将 UDF 编写为 VB 宏并在 Access 中使用该宏,但我不能在 .NET 中使用它,这让我非常恼火。
我确实需要能够对值进行索引,因此将整个列拉入 .NET,然后执行我的计算将不起作用。
【问题讨论】:
-
MyFunc实际上是做什么的?如果简单的话,大概可以换成不管使用什么接口都可用的 SQL 函数。