0

내에서 연산 식을 평가하고 내가 이것을 달성하는 방법을 많이 시도하지만 난 붙어 얼마나난이 스칼라 함수를 실행하려고 오전 SQL 스칼라 함수

Create FUNCTION CalculateElementFunc() 
RETURNS int 
AS 
BEGIN 
    DECLARE @ResultVar numeric(18,6) 
    DECLARE @eq nvarchar(MAX) 
    set @eq = '7.5/100*1258.236'  

    declare @expression nvarchar(max) 
    set @expression = @eq 

    declare @result int 
    declare @SQLString nvarchar(max) 
    Set @SQLString = N'Select @result = @expression' 

    exec sp_executesql @SQLString, N'@expression nvarchar(100)', 
      @expression, 
      @result = @result output 

    select @ResultVar = @result 

    if(@ResultVar <> ROUND(@ResultVar, 2 ,1)) 
    set @ResultVar = cast(ROUND(@ResultVar, 2 ,1) + .01 as numeric(18,2)) 

    RETURN @ResultVar 
END 

내가 그것을

를 실행하려고

선택 dbo.CalculateElementFunc()

내가이 오류가

메시지 557, 수준 16, 상태 2, 줄 1 개 만 기능 등 내 확장 된 저장 프로 시저를 함수 내에서 실행할 수 있습니다.

Please Advice

+0

T-SQL의 함수에는 부작용이있을 수 없습니다. 따라서 삽입/업데이트하거나 저장 프로 시저를 호출 할 수 없습니다. 표현 파서를 직접 구현하지 않는 한 (분명히 중요한 것은 아닙니다.) 순수 TSQL에서는 가능하지 않다고 생각합니다. 게다가 성능은 끔찍할 것입니다. 아마도 CLR 함수를 사용하면됩니다. –

+0

then .. SQL 스칼라 함수 내에서 산술 표현식을 평가하는 대안은 무엇입니까 – Mariam

+0

디자인 타임에 표현식을 알 수없고 저장 프로 시저가 아닌 함수가 필요하다면 제가 말했던 것처럼 (다른 사람들도 지적했듯이) 귀하의 유일한 옵션은 CLR 함수입니다 (또는 더 나은 아직은 : SQL에서하지 마십시오) –

답변

0

제한 사항 : 기능에

  1. 비 결정적 빌드는 사용자 정의 함수에서 사용할 수 없습니다. 예 : GETDATE() 또는 RAND().
  2. XML 데이터 형식이 지원되지 않습니다.
  3. 동적 SQL 쿼리가 허용되지 않습니다.
  4. 사용자 정의 함수는 테이블 변수에서 수행되지 않으면 DML 문 (INSERT, UPDATE, DELETE)을 지원하지 않습니다.
  5. 저장 프로 시저를 호출 할 수 없습니다. 함수에서 확장 저장 프로 시저 만 호출 할 수 있습니다.
  6. UDF 내에 임시 테이블을 만들 수 없습니다.
  7. UDF 내에서 오류 처리를 지원하지 않습니다. 이 함수를 사용하는 명령문에 대해서는 오류 (RAISEERROR, TRY-CATCH)를 처리 할 수 ​​있습니다.

그리고 사용자 정의 함수 내에서 저장 프로 시저를 사용/호출하는 것 같습니다. 그것은 당신을 괴롭히는 표현이 아닙니다. 그것은 저장 프로 시저 호출입니다.

원하는 출력을 얻기 위해 일부 논리로 교체하십시오.

희망이 있으면 도움이됩니다. 문제를 해결하는 데 도움이된다면 답으로 표시하는 것을 잊지 마십시오.

+0

그러면 SQL 스칼라 함수 내에서 산술 표현식을 평가할 수있는 대안은 무엇입니까 – Mariam

+0

@SachinA : # 1 정도 확신합니까? 비 결정적 함수는 UDF AFAIK에서 완벽하게 훌륭합니다. UDF를 비 결정적으로 만드는 것입니다. –

+0

@ P.Kouvarakis : 예, 비 결정적 내장 함수가 제대로 작동하지만 사용자 정의 함수를 실행할 때마다 - 비 결정적 함수 작성 기능은 서로 다른 출력을 제공합니다 (매번). 그리고 나는 그것을 믿을만하다고 생각하지 않습니다. –

1

이것은 댓글이 너무 길었습니다.

SQL Server에서는 수행 할 작업을 권장하지 않습니다. 첫째, 정말 어렵습니다. 알다시피 SQL Server 함수는 동적 SQL을 실행할 수 없습니다.

이것은 documentation에 미묘하다 :

은 확장 저장 프로 시저를 호출 문을 실행합니다.

execsp_executesql은 확장 저장 프로 시저가 아닙니다.

무엇을 할 수 있습니까? 다음은 몇 가지 옵션입니다.

  1. UDF가 아닌 저장 프로 시저가 있습니까? 저장 프로시 저는 동적 SQL을 실행할 수 있습니다.
  2. 표현식 평가 문제를 해결할 수 있습니까? 아마도 동적 SQL은 코드에서 한 레벨 위로 사용될 수 있습니다.
  3. 은 다른 트랜잭션을 시작하고 동적 SQL을 실행하는 확장 저장 프로 시저를 실행합니다. 생각 : 정말 나쁜 성능.
  4. CLR 확장 함수를 작성할 수 있습니다. SQL 사용자 정의 함수에
+0

SQL 스칼라 함수 내에서 산술 표현식을 평가할 방법이 없습니다 ?? – Mariam

+0

@ 마리암. . . CLR 함수를 작성하거나 확장 저장 프로 시저를 사용할 수 있습니다. 쉬운 방법은 없습니다. –