2017-12-29 2 views
0

원격 호스트의 PHP에서 odbc를 통해 사용자 정의 함수를 실행해야합니다.PHP에서 MSSQL 사용자 정의 함수를 실행하십시오.

기능 자체는 간단한 계산하고과 같이 MS SQL 서버 스튜디오에서 만들어졌습니다 : 나는

을 실행하여이 기능이 작동하고 예상 된 결과를 반환하는 것을 확인할 수 있었다

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에 있습니다.

그러나이 외의 다른 방법으로는이 기능을 실행할 수 없습니다.

[email protected]:~/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] 오류 메시지를 표시합니다 웹 서버에 CLI를 통해 해당 기능을 실행하려고 : SQLExecute를 할 수 없습니다.

$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>'; 

즉, PHP 스크립트에서 해당 기능을 실행하려고 할 때 ... 다음은 서버 오류 로그에서 찾을 수 있습니다

그렇다 나는를 실행하려고 한 것을에서

mod_fcgid: stderr: PHP Warning: odbc_exec(): SQL error: [FreeTDS][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.__WeightCalculation", or the name is ambiguous., SQL state 37000 in SQLExecDirect in /var/www/web/test/odbc.php on line 14

기능은 DECLAREEXECSELECT으로 SQL Studio에서 예상대로 작동하지만 CLI 또는 PHP를 통해 작동하지 않습니다.

매개 변수를 바인딩하고 별도로 함수를 실행해야합니까? PHP를 통해 MSSQL 사용자 정의 함수를 실행할 수있는 방법에 대한 모든 힌트 (CLI는 테스트/검증 용이므로)는 크게 감사하겠습니다.

참고 :

  1. 함수 호출은 분명히 젠토 CE 1.9에 대한 훨씬 더 큰 쿼리
  2. 실제 시나리오/사용의 경우는 제품의 수입 (~ 20K 제품)입니다 단지 일부입니다. x는 MAGMI의 원격 서버 연결을위한 odbc 기능을 사용합니다. MAGMI의 위키에 따르면 이것은 하나의 .sql 파일 안에 전체 문장을 넣을 것을 요구한다. (지금까지 작동하지 않았기 때문에 나는 더 깊은 파기를 시작했고 위에서 언급 한 근본적인 문제에 이르렀다. magento.stackexchange.com)
  3. 은 SQL Studio에서 쿼리를 실행하고 ODBC를 통해 연결되는 함수를 생성 한 사용자가 하나 개의 시점에서, 즉 SA
+0

이 기능을 만든 사용자 계정과 동일한 사용자 계정으로 실행하고 있습니까? dbo가 옳지 않을 수도 있습니다. – Ctznkane525

+0

안녕하세요 @ 존 케인 - 사실, 나는 그 정보를 놓쳤습니다. 나는 SQL Studio와 ODBC를 통해 연결된 원격 서버, 즉 _sa_ (나는 그 사용자를 데려가는 것이 가장 좋은 생각은 아니지만, 원격 서버 관리자가 지금까지 가지고있는 모든 것)이다. –

+1

@ChristophFarnleitner, make 데이터베이스 컨텍스트가 SSMS와 동일해야합니다. –

답변

0

음, 동일 그 너 맞지? ;)

내 기능은 달리 지정되지 않았으므로 master 데이터베이스 내에 만들어졌습니다. 사실 이것이 항상 사실인지 (적어도 사용자가 sa로 로그인했을 때) 말할 수는 없습니다. 누군가가 대답 할 수 있다면 흥미로울 수 있습니다.

그러나 특정 테이블에 대한 함수를 만드는 초기 생각 (@DanGuzman도 그 점을 염두에 두었습니다)이 맞았습니다. 내가 한 것처럼 올바르게했습니다. 즉,하지 -

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

- -

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

- 동안 작동하지 않습니다.

관련 문제