SQL Eval Function A SQL Eval function to execute C# directly in T-SQL


-- Evaluate dynamically expression in T-SQL
DECLARE @tableFormula TABLE (
   Formula VARCHAR(255), X INT, Y INT, Z INT
)

INSERT INTO @tableFormula VALUES ('x+y*z', 1, 2, 3 ), 
                                ('(x+y)*z', 1, 2, 3 )
-- SELECT 7
-- SELECT 9
SELECT SQLNET::New(Formula)
              .ValueInt('x', X)
              .ValueInt('y', Y)
              .ValueInt('z', Z).EvalInt() as Result
FROM @tableFormula

What's Eval-SQL.NET?

What's Eval-SQL.NET?

SQL Eval Function is a C# expression evaluator. You can evaluate arithmetic expressions, regex, and more directly in T-SQL.

Do you offer a free trial?

Do you offer a free trial?

We offer monthly trial, you can download a new trial every month.

Where can I find online examples?

Where can I find online examples?

Just click on Run button!

Our achievements


customers 5,000+ Customers
countries 75+ Countries
requests 10,000+ Requests closed
downloads 250,000,000+downloads

What ZZZ Projects achieved over the last decade has grown beyond our hopes. We help developers worldwide with free and paid solutions (because nobody works for free, nor our developers!). Every day, we are committed to listening to our clients to help ease the daily dev workload as much as possible.


Evaluate dynamic arithmetic expression in SQL

Make the impossible now possible. Evaluate C# expression in SQL to overcome limitations.

  • Allow trusted users to create report field and filter
  • Consume Web Service
  • Replace text in template with String Interpolation
SQL Eval - Dynamic Expression Example
-- Easy to use

-- CREATE test
DECLARE @table TABLE ( X INT, Y INT, Z INT )
INSERT  INTO @table VALUES  ( 2, 4, 6 ),  ( 3, 5, 7 ), ( 4, 6, 8 )

-- Result: 14, 22, 32
DECLARE @sqlnet SQLNET = SQLNET::New('x*y+z')
SELECT  @sqlnet.ValueInt('x', X)
               .ValueInt('y', Y)
               .ValueInt('z', Z)
               .EvalInt() as Result
FROM    @table

Split text with delimiter

Improve performance and capability for splitting text with an easy to use split function and LINQ expressions.

  • Split text with multiple delimiters
  • Split text using a regular expression
  • Include row index
SQL Eval - Split Text Example
-- CREATE test
DECLARE @t TABLE (Id INT , Input VARCHAR(MAX))
INSERT  INTO @t VALUES  ( 1, '1, 2, 3; 4; 5' ), ( 2, '6;7,8;9,10' )

-- SPLIT with many delimiters: ',' and ';'
DECLARE @sqlnet SQLNET = SQLNET::New('Regex.Split(input, ",|;")')

SELECT  *
FROM    @t AS A
        CROSS APPLY ( SELECT    *
                      FROM      dbo.SQLNET_EvalTVF_1(@sqlnet.ValueString('input', Input))
                    ) AS B

Use regular expression in SQL Server

Use Regex flexibility to overcome "LIKE" and "PATINDEX" limitations.

  • IsMatch
  • Match
  • Matches
  • Replace
  • Split
SQL Eval - Regular Expression Example
DECLARE @customer TABLE ( Email VARCHAR(255) )

INSERT  INTO @customer
VALUES  ( 'info@zzzprojects.com' ),
        ( 'invalid.com' ),
        ( 'sales@zzzprojects.com' )

DECLARE @valid_email SQLNET = SQLNET::New('Regex.IsMatch(email, 
@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$")')

-- SELECT 'invalid.com'
SELECT * FROM @customer WHERE @valid_email.ValueString('email', Email).EvalBit() = 0

Replace xp_cmdshell with restrictive alternative

Avoid enabling xp_cmdshell and compromising your SQL Server and use instead a more restrictive solution.

  • Impersonate Context
  • Improve maintainability
  • Improve readability
  • Improve security
SQL Eval - IO Example
-- REQUIRE EXTERNAL_ACCESS permission
DECLARE @sqlnet SQLNET = SQLNET::New('
string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

var dir = new DirectoryInfo(path);
return dir.GetFiles("*.*")
          .Select(x => new { x.FullName, FileContent = File.ReadAllText(x.FullName) })
          .OrderBy(x => x.FullName)')
          .Impersonate()

-- SELECT FullName, FileContext FROM DesktopFiles ORDER BY Fullname
EXEC dbo.SQLNET_EvalResultSet @sqlnet