2. Peter Gfader Specializes in C# and .NET (Java not anymore) TestingAutomated tests Agile, ScrumCertified Scrum Trainer Technology aficionado Silverlight ASP.NET Windows Forms
5. What we did last weekHigh availability ? What can go wrong? What can we do? Implementing Database Snapshots Configuring a Database Mirror Partitioned Tables SQL Agent Proxies Performing Online Index Operations Mirrored Backups
8. Agenda - CLR Integration What is .NET? What is CLR Integration? Requirements on SQL box Samples Internals CLR Integration: Pros CLR Integration: Cons Real world - When to use CLR Integration
9. What is .NET? An application development platform from Microsoft Tools, Languages, Runtime (Virtual machine), IDE, … Rapidly develop secure and robust software Web and Windows Full support for object-oriented programming
13. What is CLR Integration? Lets you write your database queries using .NET Create and debug using VS 2008 IDE Brand new in SQL 2005 (Standard and Express) Support for large UDT (User defined types) in SQL 2008 (up to 2GB) Support for multiple inputs on UDA (User defined aggregators) e.g. string concatenator that takes in a column and separator char Any .NET language (C#, VB, C++)
16. CLR Integration You can do the same thing as SQL Server using .NET code Stored Procedures Triggers User-defined functions User-defined types Aggregate functions
17. Server - Enabling CLR Integration Enabled on an instance (not per database) SQL Script Execute sp_configure ‘clr enabled’, ‘1’ reconfigure
19. public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void HelloWorld() { // Put your code here using (SqlConnectioncn = new SqlConnection("Context Connection=true")) { cn.Open(); SqlCommandcmd = new SqlCommand("SELECT * FROM DEMO", cn); SqlContext.Pipe.Send(cmd.ExecuteReader()); } } Sample
20. What you do Enable CLR Create a new database project in Visual Studio Create a new stored procedure in Visual Studio Connect to current context using “Context Connection=true” Add a simple SELECT statement Deploy and run it
21. Internals Assembly collated as set of files Stored within SQL Server system tables Assembly, references, program database (pdb), source files Deployed to SQL Server Manually Catalogued with CREATE ASSEMBLY Dropped with DROP ASSEMBLY Automatically Deployed from VS 2008
22. Security Levels Safe (default) Access only to CLR code. No access is allowed to external resources, thread management, unsafe code or interop. External_Access Access is allowed to external systems, such as the EventLog, File System, and network. Still no access to unsafe code or interop code. Unsafe Access is not limited whatsoever. User-defined types
24. public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static boolIsValidPostCode(string postcode) { return System.Text.RegularExpressions.Regex.IsMatch( postcode, ^(((2|8|9){2})|((02|08|09){2})|([1-9]{3}))$"); } }; Sample
25. What you do Create IsValidPostCode in C# (.NET) Deploy it to SQL Server Run it
26. Stored procedure vs. Function What is the difference? Function Base functionality Independent of Database itself Stored procedure Many operations at once Normally database specific
28. public partial class Triggers { [Microsoft.SqlServer.Server.SqlTrigger(Name = "EmailTrigger", Target = "Customers", Event = "FOR UPDATE")] public static void SalaryFraudTrigger() { SqlTriggerContext context = SqlContext.TriggerContext; using (SqlConnectioncnn = new SqlConnection("context connection=true")) { cnn.Open(); SqlCommand command = cnn.CreateCommand(); command.CommandText = "SELECT * FROM inserted"; SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { for (intcolumnNumber = 0; columnNumber<context.ColumnCount; columnNumber++) { SqlContext.Pipe.Send(string.Format("Col: {0} = {1}", columnNumber, reader[columnNumber].ToString())); } }; reader.Close(); } } } Sample
29. What you do Create EmailTrigger in C# (.NET) Deploy it to SQL Server Test it
30. CLR Integration: Pros (Continued) Take advantage of the powerful .NET Framework .NET is a full-featured programming language Supports things like “for each” loops, arrays, collections Object Oriented programming model to organise your queries Obtaining data from external resources The File System The Event Log A Web Service The Registry
31. CLR Integration: Pros For complex calculations Parsing strings (like the regular expression code) User-defined types Date, time, currency, and extended numeric types Geospatial applications Encoded or encrypted data (see books online) User-defined aggregates Powerful Intellisense and debugging Generally faster E.g. CLR aggregate 100x faster than cursor
32. CLR Integration: Cons (Continued) NON MAINSTREAM Lots of programming for simple operations Some overhead in communicating with assemblies Remember – T-SQL is designed and optimised for data, use it! Not useful if your guys do not know any .NET Potentially costly to rewrite logic Companies (including us) have invested a lot in T-SQL
33. CLR Integration: Cons There are some restrictions to observe when calling between T-SQL and SQL-CLR. You must only use T-SQL supported data types (No streams) You can't use inheritance or polymorphism .NET cannot easily represent either VARCHAR or TIMESTAMP .NET strings are Unicode, the equivalent of NVARCHAR The CLR decimal type is not the same as SQL_DECIMAL
34. When to use CLR Integration Do I need to manipulate data before it is displayed? .NET code and SQLCLR Do I need to do set-based operations such as pivoting? T-SQL Do I need to do extensive computation or custom algorithms? .NET code and SQLCLR Are my developers SQL gurus but .NET newbies? T-SQL Do I have loads of stored procs that are becoming hard to manage? .NET code and SQLCLR
35.
36.
37. Session 4 Lab CLR Integration Download from Course Materials Site (to copy/paste scripts) or type manually: http://tinyurl.com/utssql2009