Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 使用“scalier”t-sql自定义函数,您就可以在t-sql中享受与Access VBA开发人员相同的开发方法(这种方法是编写自定义函数,然后您就可以在编写的任何sql中自由使用这些自定义函数)_Ms Access - Fatal编程技术网

Ms access 使用“scalier”t-sql自定义函数,您就可以在t-sql中享受与Access VBA开发人员相同的开发方法(这种方法是编写自定义函数,然后您就可以在编写的任何sql中自由使用这些自定义函数)

Ms access 使用“scalier”t-sql自定义函数,您就可以在t-sql中享受与Access VBA开发人员相同的开发方法(这种方法是编写自定义函数,然后您就可以在编写的任何sql中自由使用这些自定义函数),ms-access,Ms Access,事实上,我有大量的sql(不是我的)使用: 从tblPrices中选择id、CDBL(股票价格)作为股票价格 以前的设计器将一些值存储为文本列。因此,我创建了一个scaler t-sql函数,如下所示: strSQL = "UPDATE tblEmp SET tblEmp.EmpName1 = '" & Encrypt([tblEmp].[EmpName]) & "'" ALTER FUNCTION [dbo].[CDBL] ( -- Add the parameters fo

事实上,我有大量的sql(不是我的)使用:

从tblPrices中选择id、CDBL(股票价格)作为股票价格

以前的设计器将一些值存储为文本列。因此,我创建了一个scaler t-sql函数,如下所示:

strSQL = "UPDATE tblEmp SET tblEmp.EmpName1 = '" & Encrypt([tblEmp].[EmpName]) & "'"
ALTER FUNCTION [dbo].[CDBL]
(
-- Add the parameters for the function here
@P1 sql_variant
)

RETURNS float

AS
BEGIN
   -- Declare the return variable here
   DECLARE @Result float

   -- Add the T-SQL statements to compute the return value here
   SET @Result = CAST(@P1 as float)
   -- Return the result of the function
   RETURN @Result

END
写下上述内容后,然后:

SELECT id, dbo.CDBL(StockPrice) as StockP from tblPrices

因此,我建议您用t-sql重新编写VBA代码。T-sql几乎拥有VBA的所有功能,因此我从未遇到过无法用T-sql编程语言重新创建服务器端的VBA代码。因此,t-sql函数的工作原理与VBA函数类似,一旦编写,您就可以在任何其他代码中,甚至在您编写的sql查询中自由使用这些自定义函数

如前所述,您可以使用PT查询,但如果值来自每一行,并且您需要每一行的函数,则此类查询不能使用Access中的函数

但是,不清楚为什么需要PT查询

另一种解决方案是将VBA函数重新编写为T-SQL函数。所谓的“scaler”函数的工作原理与VBA类似,但都是服务器端的,并且是用T-SQL编写的。鉴于T-SQL具有循环和VBA几乎所有的功能,那么一旦您将代码重新编写为T-SQL,您的PT查询就会变成:

UPDATE tblEmp SET tblEmp.EmpName1 = dbo.Encrypt([tblEmp].[EmpName])
过去,我有一个用VBA编写的全局GST函数,该函数将返回GST费率(基于当前日期,因此:

SELECT id, CompanyName, invoiceNumber, InvoiceDate, GST(InvoiceDate) as GSTRate
FROM tblInvoices
因此,我只需重新编写GST()函数(VBA)作为一个T-SQL函数。这允许轻松地将Access SQL转换为T-SQL。因此,现在可以将视图,甚至PT quires发送到服务器。所谓的T-SQL scaler函数的工作方式与编写全局VBA函数时的工作方式相同。一旦编写,此类函数可以用于任何SQL表达式和您编写的任何T-SQL SQL甚至T-SQL代码

因此,我的建议是将encrypt VBA函数重新编写为t-sql。请注意,对于不必在此类scaler函数前面加上dbo.FunctionName(因此您必须使用dbo.FunctionName)的方法,我显得非常枯燥

然而,对于复杂的需求,甚至是创建服务器端视图,获取Access SQL并将其转换为t-SQL以及GST函数或任何函数(例如,您的encrypt()函数变为dbo.encrypt())仍然是相当不错的

这里的美妙之处在于,您可以在编写的任何sql中使用该函数,现在包括服务器端sql

因此,在访问SQL(后端)转换项目的过程中,为了节省大量时间并避免重新编写SQL,通过采用“scalier”t-SQL自定义函数的用户,您可以在t-SQL中享受与Access VBA开发人员相同的开发方法(这种方法是编写自定义函数,然后可以在编写的任何SQL中自由使用这些函数)

事实上,我有大量的sql(不是我的)使用:

从tblPrices中选择id、CDBL(股票价格)作为股票价格

前面的设计器将一些值存储为文本列。因此,我创建了一个scaler t-sql函数,如下所示:

strSQL = "UPDATE tblEmp SET tblEmp.EmpName1 = '" & Encrypt([tblEmp].[EmpName]) & "'"
ALTER FUNCTION [dbo].[CDBL]
(
-- Add the parameters for the function here
@P1 sql_variant
)

RETURNS float

AS
BEGIN
   -- Declare the return variable here
   DECLARE @Result float

   -- Add the T-SQL statements to compute the return value here
   SET @Result = CAST(@P1 as float)
   -- Return the result of the function
   RETURN @Result

END
写下上述内容后,然后:

SELECT id, dbo.CDBL(StockPrice) as StockP from tblPrices

因此,我建议您用t-sql重新编写VBA代码。t-sql几乎具有VBA的所有功能,因此我从未遇到过无法用t-sql编程语言重新创建服务器端的VBA代码。因此,t-sql函数的工作原理与VBA函数一样,一旦编写,您就可以在任何其他代码中自由使用此类自定义函数,甚至在您编写的sql查询。

我想用一条sql语句更新所有行以加快进程。您的sql语句不起作用。我想用一条sql语句更新所有行以加快进程。您的sql语句不起作用。您好,谢谢您的提示。如果加密函数有两个参数,其中第二个参数ter是一个字符串,如何编写sql语句?谢谢。更新localTemp SET EmpName1=Encrypt(EmpName,“pass123”)如果第二个参数对于所有行都是相同的,那么是的,这将起作用。如果我像这样编写代码,它会起作用吗?cdb.Execute“updatelocaltempsetempname1=Encrypt(EmpName,“pass123”)”,dbfailonerror更像
“UPDATE localTemp SET EmpName1=Encrypt(EmpName”,“pass123”)”
您好,谢谢您的提示。如果Encrypt函数有两个参数,其中第二个参数是字符串,我该如何编写sql语句?谢谢。UPDATE localTemp SET EmpName1=Encrypt(EmpName,“pass123”)如果第二个参数对于所有行都是相同的,那么是的,这将起作用。如果我像这样编写代码,它会起作用吗?cdb.Execute“updatelocaltempsetempname1=Encrypt(EmpName,“pass123”)”,dbfailonerror更像
“更新本地临时设置EmpName1=Encrypt(EmpName”,“pass123”)”