sql server 2012 — выполнить пользовательскую функцию 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)

в студии управления.

Однако я не могу выполнить эту функцию любым другим способом, кроме этого.

При попытке запустить эту функцию через 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 только для тестирования / проверки), очень приветствуются.

Пожалуйста, обратите внимание:

  1. Вызов функции, очевидно, является лишь частью гораздо большего запроса
  2. Фактический сценарий / сценарий использования — это импорт продукта (~ 20 тыс. Продуктов) для Magento CE 1.9.x с использованием возможности MAGMI для подключения odbc на удаленном сервере. В соответствии с вики MAGMI, однако, это требует, чтобы весь оператор был помещен в один .sql-файл (поскольку до сих пор это не работало, я начал копать глубже и подошел к вышеупомянутой фундаментальной проблеме, поэтому я решил разместить свой вопрос здесь, а не в magento.stackexchange.com)
  3. Пользователь, создавший функцию, который выполняет запрос в SQL Studio и который подключен через ODBC, один и тот же, а именно са

0

Решение

Ну, в какой-то момент это ударяет тебя, верно? 😉

Моя функция, поскольку не указано иное, была создана в базе данных master, На самом деле я не могу сказать вам, всегда ли это так (по крайней мере, когда вы вошли как sa) — может быть интересно, если кто-то может ответить на этот.

Тем не менее, первоначальная мысль о создании функции для конкретной таблицы (я думаю, @DanGuzman имел это в виду и в какой-то момент?) Была правильной, просто то, как я это сделал, было неверным, т.е.

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

— НЕ работает, пока —

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

— делает.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]