MSSQL FUNCTION안에 EXEC 실행 안되는데 문제 해결 방안은?? 0

by 코딩맨 [SQL Query] [2022.02.21 19:12:36]


DB가 MSSQL 입니다.

 

호출 부 SELECT dbo.FN_CALCULATE( '((2022 - 44 + 3 ) * (2 / 1 ) - 30 )')

메시지 8114, 수준 16, 상태 5, 줄 11

데이터 형식 varchar을(를) float(으)로 변환하는 중 오류가 발생했습니다.

 

MSSQL은 FUNCTION안에 EXEC 를 사용할 수 없나 봅니다

계산 산식을 던져서 값을 받아 보고 싶은데요

고수님들 어떻게 해결 방법이 없을까요?

 SELECT  CONVERT(float, '((2022 - 44 + 3 ) * (2 / 1 ) - 30 )')  <--- 이런 거 거든용!

 

--- 아 래 -----

/****** Object:  UserDefinedFunction [dbo].[FN_SPLIT_COUNT]    Script Date: 2022-02-21 오전 10:53:26 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER FUNCTION [dbo].[FN_CALCULATE](

    @CALCULATE_STRING NVARCHAR(MAX)

)RETURNS FLOAT AS

/******************************************************************************

   NAME:       FN_CALCULATE

   PURPOSE:    입력받은 문자열의 값을 계산하여 최종 값을 반환함

******************************************************************************/

BEGIN

 

DECLARE @Result FLOAT

SET     @Result =  CONVERT(float  ,@CALCULATE_STRING);

 

RETURN  @Result;

 

 

/*

DECLARE @Result FLOAT

DECLARE @REPLACE_COMMA NVARCHAR(MAX);

SET     @REPLACE_COMMA =  REPLACE(@CALCULATE_STRING, '''', '');

SET     @Result =  CONVERT(float  ,@REPLACE_COMMA);

 

RETURN  @Result;

*/

 

/*

    DECLARE @Result FLOAT

        DECLARE @res    Decimal(16,2)

        DECLARE @SQL    NVARCHAR(2000) = '';

    SET     @Result = 0

 

        SET @SQL =  'SELECT ' +  @CALCULATE_STRING;

   

        EXEC Sp_Executesql @SQL, N'@res decimal (16,2) OUTPUT',

 

        @Result= @res output;

       

   -- SELECT  @Result = @CALCULATE_STRING;

   --  exec sp_executesql @SQL;

 

 

    RETURN @Result

*/

 

/*

    DECLARE @Result FLOAT

DECLARE @sql nvarchar(max)

 

SELECT @sql = N'

DECLARE @x xml = ''''

SELECT CAST(@x.query('''+ @CALCULATE_STRING +''') as nvarchar(max))'

 

EXEC sp_executesql @sql

 

RETURN @Result

*/

 

/*

    DECLARE @Result FLOAT

        DECLARE @SQL    NVARCHAR(2000) = '';

    SET     @Result = 0

 

     SET @SQL =  'SELECT ' +  @CALCULATE_STRING;

   -- SELECT  @Result = @CALCULATE_STRING;

     exec sp_executesql @SQL;

 

 

    RETURN @Result

*/

 

END

by 마농 [2022.02.22 09:15:50]
DECLARE @Sql NVARCHAR(100)
DECLARE @Calculate_String NVARCHAR(100)
DECLARE @Result FLOAT

SET @Calculate_String = N'1 + 2 * 3'
SET @Sql = N'SELECT @v = ' + @Calculate_String

EXECUTE sp_executesql @Sql, N'@v FLOAT OUTPUT', @v = @Result OUTPUT

SELECT @Result

 


by 코딩맨 [2022.02.22 10:06:02]

마농님 답변 감사합니다

해당 FUNCTION을 실행 해 보니~~~ 에러가 납니다

메시지 557, 수준 16, 상태 2, 줄 16

함수 내에서는 함수와 일부 확장 저장 프로시저만 실행할 수 있습니다.

 

완료 시간: 2022-02-22T09:59:52.7279803+09:00


by 마농 [2022.02.22 10:11:44]

사용하신 코드 보여주세요.


by 코딩맨 [2022.02.22 10:29:03]

/****** Object:  UserDefinedFunction [dbo].[FN_CALCULATE]    Script Date: 2022-02-22 오전 10:26:44 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

ALTER FUNCTION [dbo].[FN_CALCULATE](

    @CALCULATE_STRING2 NVARCHAR(MAX)

)RETURNS FLOAT AS

/******************************************************************************

   NAME:       FN_CALCULATE

   PURPOSE:    입력받은 문자열의 값을 계산하여 최종 값을 반환함

 

   REVISIONS:

   VER        DATE        AUTHOR           DESCRIPTION

   ---------  ----------  ---------------  ------------------------------------

   1.0        2022/02/21   WSH       1. CREATED THIS FUNCTION.

 

******************************************************************************/

BEGIN

 

DECLARE @Sql NVARCHAR(100)

DECLARE @Calculate_String NVARCHAR(100)

DECLARE @Result FLOAT

 

SET @Calculate_String = N'1 + 2 * 3'

SET @Sql = N'SELECT @v = ' + @Calculate_String

 

EXECUTE sp_executesql @Sql, N'@v FLOAT OUTPUT', @v = @Result OUTPUT

 

 RETURN  @Result;

 

END


by 마농 [2022.02.22 10:47:51]

음... 검색해보니 프로시져는 함수 내에서 사용이 안되는 것 같네요.


by 코딩맨 [2022.02.22 10:55:40]

예~~~ 그런것 같더라구요!

혹시나 다른 우회 방법은 없을까요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입