안녕하세요
MSSQL 에서 쿼리 작업중 두가지 문제점이 있어서 질문 드리게 되었습니다.
첫번째, 계산 수식을 텍스트로 받아 계산된 값을 리턴 받으려고 합니다.
그래서 아래와 같은 XQuery를 사용하는 쿼리를 사용하려고 하는데
아래와 같이 x.query 에 직접적으로 수식을 넣으면 제대로 동작하는데
변수를 사용하려고 하면 값이 나오지 않고 수식이 그대로 나오네요 ㅠㅠ
꼭 변수로 사용해야하는데 좋은 방법이 있을까요?
[직접 수식 입력]
SELECT rs.value('.[1]', 'money')
FROM ( SELECT x.query('(89 div 2) * (3 * 600 + 510)') rs
FROM (SELECT CONVERT(XML, '') x) a
) t
[변수 사용]
DECLARE @EXPRESSION VARCHAR(100)
SET @EXPRESSION = '(89 div 2) * (3 * 600 + 510)'
SELECT x.query('sql:variable("@EXPRESSION")') rs
FROM (SELECT CONVERT(XML, '') x) a
두번째, 위와 같은 쿼리에서 산술식에 제곱을 포함하려고 하는데
ex) 600+(60-(60^2-48^2)^0.5)/2
XQuery 에는 제곱(^) 산술식을 지원하지 않는다고 하네요
다른 좋은 방법이 있는지 알려주세요 ㅠㅠ
고수님들 답변 달아주시면 감사하겠습니다!!
Comment 2
-
건우아빠
2020.11.05 18:20
declare@sql nvarchar(1000), @expression nvarchar(500)set @expression = '(89 div 2) * (3 * 600 + 510)'set @sql = 'select rs.value(''.[1]'', ''money'')from (select x.query(''' + @expression + ''') rsfrom (select convert(xml, '''') x) a) t'print @sqlexec(@sql) -
지영아빠
2020.11.09 14:29
Language에 보이는 eval같은 함수가 있다면... 정말 좋은데요.그런게 없어서 대략 temp table과 exec를 이용했는데... 이게 Function에서 쓸수 없는 거라쿼리에서 자유롭게 쓰기는 불편한 부분이 보이네요..clr도 방법일것 같고. 외부 script를 이용하는 것도 방법일 것 같습니다.declare@exp varchar(1000) ,@ret decimal(20, 5)-- 중간에 결과 담을if object_id('tempdb..#t') is not nulldrop table tempdb..#tcreate table #t (v decimal(20, 5)) ;-- 제곱set @exp = '(89 ^ 2) * (3 * 600 + 510)'insert into #t (v)exec('Select ' + @exp)select @ret = v from #tselect @rettruncate table #t-- div -> /로 해서set @exp = '(89 / 2) * (3 * 600 + 510)'insert into #t (v)exec('Select ' + @exp)select @ret = v from #tselect @ret