繁体   English   中英

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

[英]execute MSSQL user-defined function in PHP

我需要通过远程主机上的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中。

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

当尝试通过Web服务器上的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]错误:无法执行SQL。 当试图从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”,或者名称不明确。第14行的/var/www/web/test/odbc.php中的SQLExecDirect中的状态37000

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

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

请注意:

  1. 函数调用显然只是更大查询的一部分
  2. 实际的场景/用例是使用MAGMI的odbc在远程服务器上连接的能力为Magento CE 1.9.x导入产品(约2万种产品)。 根据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

-确实。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM