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

时间:2017-12-29 18:27:35

标签: php sql-server-2012 odbc user-defined-functions isql

我需要在远程主机上的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   服务器]无法找到任何列&#34; dbo&#34;或用户定义的   功能或聚合&#34; dbo .__ WeightCalculation&#34;,或   名称不明确。,SQLExecDirect中的SQL状态37000   第14行/var/www/web/test/odbc.php

除此之外,我还尝试使用DECLARE EXEC SELECT执行该功能,该功能也在SQL Studio中按预期工作,但不是通过CLI或PHP。< / p>

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

请注意:

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

1 个答案:

答案 0 :(得分:0)

好吧,有一次它会袭击你,对吗? ;)

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

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

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

- 不起作用,而 -

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

- 确实。