Мне нужно выполнить пользовательскую функцию изнутри 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)
в студии управления.
Однако я не могу выполнить эту функцию любым другим способом, кроме этого.
При попытке запустить эту функцию через 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] ОШИБКА: не удалось выполнить 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
Сервер] Не могу найти ни один столбец "ПСЭ" или пользовательский
функция или совокупность "ПСЭ .__ WeightCalculation", или же
имя неоднозначно., состояние SQL 37000 в SQLExecDirect в
/var/www/web/test/odbc.php в строке 14
Помимо этого я пытался выполнить функцию с DECLARE
EXEC
SELECT
который также работает как ожидалось в SQL Studio, но не через CLI или PHP.
Нужно ли связывать параметры и выполнять функцию отдельно? Любые советы о том, как я могу выполнить пользовательскую функцию MSSQL через PHP (поскольку CLI только для тестирования / проверки), очень приветствуются.
Пожалуйста, обратите внимание:
Ну, в какой-то момент это ударяет тебя, верно? 😉
Моя функция, поскольку не указано иное, была создана в базе данных master
, На самом деле я не могу сказать вам, всегда ли это так (по крайней мере, когда вы вошли как sa
) — может быть интересно, если кто-то может ответить на этот.
Тем не менее, первоначальная мысль о создании функции для конкретной таблицы (я думаю, @DanGuzman имел это в виду и в какой-то момент?) Была правильной, просто то, как я это сделал, было неверным, т.е.
CREATE FUNCTION [databasename].dbo.functionname(@params)
...
GO
— НЕ работает, пока —
USE [databasename];
GO
CREATE FUNCTION dbo.functionname(@params)
...
GO
— делает.
Других решений пока нет …