我需要在远程主机上的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仅用于测试/验证)非常感谢。
请注意:
答案 0 :(得分:0)
我的功能,因为未另行指定,是在数据库master
内创建的。事实上,我不能告诉你是否总是这样(至少当你以sa
身份登录时) - 如果有人能回答那个问题,可能会很有趣。
然而,为特定表格创建函数的初步想法(我认为@DanGuzman在某些方面也考虑到了这一点?)是正确的,就像我做的那样,是错误的,即 -
CREATE FUNCTION [databasename].dbo.functionname(@params)
...
GO
- 不起作用,而 -
USE [databasename];
GO
CREATE FUNCTION dbo.functionname(@params)
...
GO
- 确实。