2014-02-06 10 views
1

문자열에서 표현식 평가에 대한 질문이 있습니다. 현재 DB에 저장된 문자열로부터 수학적 표현식을 계산해야하는 프로젝트에서이 문자열을 평가하는 C# 메서드를 만들고 싶습니다.이 함수는 저장 프로 시저 또는 DB에 추가 된 함수에서 실행됩니다. 그래서 문제는 NCalc 나 Jace.Net과 같은 솔루션을 이미 만든 C# 함수에서 사용하고 싶지만 db에서 실행하려면 db (예 : NCalc.dll 또는 Jace.dll)를 db에 추가해야합니다. 어셈블리. 그리고 이러한 솔루션을 추가하는 것은 상당히 문제가 있습니다. NCalc는 안전하지 않은 코드를 사용하고 Sql 서버는이 DLL로부터 메소드를 실행할 수 없지만 Jace는 DB에 추가해야하는 추가 dll이 필요합니다. 이는 용인 할 수없는 해결책입니다. 그래서 어느 누구든지 db에 추가되어 실행될 수있는 작업 표현식 평가자를 알고 있다면? Thx 사전에 도움을.수식 평가

나는 마이크로 소프트 SQL 서버 2012 (SP1) 사용하고 있습니다 - 11.0.3128.0 (X64) 2)과 닷넷 프레임 워크 4.5

+0

계산이 얼마나 복잡합니까? 간단한 + -/*()는 XPathDocument를 사용하여 수행 할 수도 있고 직접 작성할 수도 있습니다. 이들은 관리 코드에서 제 3 자 dll없이 실행할 수 있습니다. http://answers.unity3d.com/questions/34349/how-to-evaluate-a-mathematical-expression-in-unity.html – Maarten

+1

다음을 참조하십시오 : int [] table = {1, 2, 3, 4, 5}; int [] table2 = {1, 3, 4, 5, 7, 100}; var output = Formula.Evaluate ("[x] <1 또는 [w] == 10", Formula.Evaluate ("(Avg ([x])/[y] + Max ([z])", 테이블 , 10, table2), 10); 꽤 복잡하고 앞으로는 FFT 나 STDEV와 같은 계산식을 사용할 수 있어야합니다. – blindepl

+0

"평가"기능을 사용한다고 가정 해 보겠습니다. T-SQL에서 호출하는 방법을 보여줄 수 있습니까? 많은 일이 분명 해져야합니다. 예 : 배열을 CLR 함수에 전달하는 방법은 무엇입니까? –

답변

0

A. 난 당신의 원에 자바 스크립트 엔진을 내장 포함 수 있다고 생각하여 관심사.

예 : http://jurassic.codeplex.com/ - 순수한 닷넷, 하나의 DLL로 파이로 쉽게 (하지만 여전히 PERMISSION_SET = UNSAFE/EXTERNAL_ACCESS가 필요합니다. 그리고 CLR 라이브러리에 특별히 필요하지 않은 것은 UNSAFE가 필요하다고 생각합니다. 예를 들어, UNSAFE가되기 위해 읽기 전용이 아닌 정적 필드가 있으면 충분합니다. 기타 제한 : http://msdn.microsoft.com/en-us/library/ms403273.aspx).

B. T-SQL은 동적 언어이기도합니다. T-SQL에서 표현식을 저장할 수없는 이유는 무엇입니까? IMHO SQL Server는 "CLR 드레그"라고 할 수있는 모든 표현식 평가 기보다 "평균"실행에 훨씬 적합합니다.

+1

당신이 저에게 보내는 링크에서 기사를 읽은 후에, 모든 것이 더 명확하게됩니다. NCalc는 캐싱 목적으로 정적 속성을 사용합니다. 정적 인 읽기 전용 속성은 어셈블리를 안전한 것으로 추가하려는 경우 금지됩니다. 코드에서 일부 변경 (정적 속성 제거)을 한 후에 모든 것이 올바르게 작동합니다. 어셈블리를 추가 할 때 더 많은 제한이 있지만 내 경우에는이 것이 중요했습니다. Thx 도움. – blindepl

+0

마지막으로 두 가지 방법으로 어셈블리 권한 세트를 변경할 수 있습니다. 1. SQL 관리 스튜디오에서 Database-> Programmability-> Assemblies-> ex "Unrestricted"(정적 필드를 사용하여 어셈블리를 실행할 수 있음)로 이동하십시오. 2. assebly-> permission set -> safe/external/Unsafe에서 참조 -> rmb 프로젝트 (SQL Server 데이터베이스 프로젝트)로 이동하십시오. – blindepl