在PHP中执行MSSQL用户定义的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PHP中执行MSSQL用户定义的函数相关的知识,希望对你有一定的参考价值。

我需要在远程主机上的php内执行用户定义的函数(通过odbc)。

函数本身是一个简单的计算,并在MS SQL Server Studio中创建,如下所示:

CREATE FUNCTION dbo.__WeightCalculation(@_Length float, @_Width float, @_Height float, @_ShapeType nvarchar(255)) 
RETURNS float AS 

BEGIN
    return (select 
        (CASE
            WHEN @_ShapeType  = 'A'
            THEN (((@_Width * @_Height * 0.5) / 100) * @_Length) / 1000 
            WHEN @_ShapeType IN ('B', 'C', 'D', 'E') 
            THEN (((@_Width * @_Height * 0.75) / 100) * @_Length) / 1000 
            ELSE 'nA'
        END) as THIS_WEIGHT)
END;

我已经能够验证此函数是否正常工作并通过执行返回预期结果

select dbo.__WeightCalculation(10, 20, 30, 'A');


----------------------
0,03

(1 Zeile(n) betroffen)

在Management Studio中。

但是,我无法以任何其他方式执行此功能。

当尝试通过网络服务器上的CLI运行该功能时,即

user@server:~/tmp# isql dsn usr pwd
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select dbo.__WeightCalculation(10, 20, 30, 'A');
[ISQL]ERROR: Could not SQLExecute
SQL>

它会提示[ISQL] ERROR:无法SQLExecute。尝试从PHP脚本运行该函数时

$connect = odbc_connect($dsn, $user, $pw);
$query = "SELECT dbo.__WeightCalculation(10, 20, 30, 'A')";
$result = odbc_exec($connect, $query);
$row = odbc_fetch_array($result);
echo '<pre>';
print_r($row);
echo '</pre>';

...可以在服务器错误日志中找到以下内容:

mod_fcgid:stderr:PHP警告:odbc_exec():SQL错误:[FreeTDS] [SQL Server]无法找到列“dbo”或用户定义的函数或聚合“dbo .__ WeightCalculation”,或者名称不明确。,SQL第14行的/var/www/web/test/odbc.php中的SQLExecDirect中的状态37000

除此之外,我还尝试使用DECLARE EXEC SELECT执行该功能,该功能在SQL Studio中正如预期的那样工作,但不是通过CLI或PHP。

我是否需要绑定参数并单独执行该功能?关于如何通过PHP执行MSSQL用户定义函数的任何提示(因为CLI仅用于测试/验证)非常感谢。

请注意:

  1. 函数调用显然只是更大查询的一部分
  2. 实际场景/用例是Magento CE 1.9.x的产品导入(~20k产品),使用MAGMI在远程服务器上进行odbc连接的能力。根据MAGMI的wiki,这需要将整个语句放在一个单独的.sql文件中(因为这不起作用到目前为止我开始深入挖掘并提到上面提到的基本问题因此我决定在这里发布我的问题而不是在magento.stackexchange.com)
  3. 创建函数的用户,在SQL Studio中运行查询以及通过ODBC连接的用户是相同的,即sa
答案

嗯,有一次它击中了你,对吧? ;)

我的函数,因为没有另外指定,是在数据库master中创建的。事实上,我不能告诉你这是否总是如此(至少当你以sa登录时) - 如果有人可以回答那个问题,可能会很有趣。

然而,最初为特定表创建函数的想法(我认为@DanGuzman在某些方面也考虑到了这一点?)是正确的,就像我做的那样,是错误的,即 -

CREATE FUNCTION [databasename].dbo.functionname(@params)
  ...
GO

- 不起作用,而 -

USE [databasename];
GO
CREATE FUNCTION dbo.functionname(@params)
  ...
GO

- 的确如此。

以上是关于在PHP中执行MSSQL用户定义的函数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL用户定义函数使用日期自动递增值

VSCode自定义代码片段——声明函数

PHP 3 函数

VSCode自定义代码片段8——声明函数

什么是PHP的函数?

php入门part3