Transcript SQL CLR

SQL Server 2008 for Developers

UTS Short Course

Course Website

 Course Timetable & Materials  http://www.ssw.com.au/ssw/Events/2010UTSSQL/  Resources  http://sharepoint.ssw.com.au/Training/UTSSQL/

Course Overview

Session Date

1 2 3 4 5 Tuesday 06-03-2012 Tuesday 13-03-2012 Tuesday 20-03-2012 Tuesday 27-03-2012 Tuesday 03-04-2012

Time Topic

18:00 - 21:00 SQL Server 2008 Management Studio 18:00 - 21:00 T-SQL Enhancements 18:00 - 21:00 High Availability 18:00 - 21:00 CLR Integration 18:00 - 21:00 Full-Text Search

What we did last week High 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

SQL CLR Integration

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

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

.NET Overview

 IL = Intermediate Language  CLR = Runtime

 CLR   

C

ommon

L

anguage

R

untime  = Virtual machine

.NET Framework

 Evolution  The whole .NET FX  http://shrinkster.com/1515 (PDF Poster)

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++)

SQL CLR Project

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

Server - Enabling CLR Integration

 Enabled on an instance (not per database)  SQL Script   Execute sp_configure ‘clr enabled’, ‘1’ reconfigure

Stored Procedures

Sample

public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void HelloWorld() { // Put your code here using (SqlConnection cn = new SqlConnection("

Context Connection=true

")) { cn.Open(); SqlCommand cmd = new SqlCommand("SELECT * FROM DEMO", cn); } } SqlContext.Pipe.Send(cmd.ExecuteReader());

What you do

1.

2.

3.

4.

5.

6.

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

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

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

Custom CLR Functions

Sample

public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static bool IsValidPostCode(string postcode) { return System.Text.RegularExpressions.Regex.IsMatch( postcode, ^(((2|8|9)\d{2})|((02|08|09)\d{2})|([1-9]\d{3}))$"); } };

What you do

1.

2.

3.

Create

IsValidPostCode

in C# (.NET) Deploy it to SQL Server Run it

Stored procedure vs. Function

 What is the difference?

 Function    Base functionality Independent of Database itself Stored procedure   Many operations at once Normally database specific

Triggers

Sample

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

What you do

1.

2.

3.

Create

EmailTrigger

in C# (.NET) Deploy it to SQL Server Test it

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

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

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

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

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

CLR Integration

• •

The Bottom Line

Use T-SQL for all data operations Use CLR assemblies for any complex calculations and transformations

Quick tips

 SQL Management Studio

Shortcuts

  Ctrl + L – Display query execution plan F5 – Run/Show result grid  Rules for SQL Server http://www.ssw.com.au/SSW/Standards/default.aspx

 SQL Server Cheat sheet http://www.pinaldave.com/sql-download/SQLServerCheatSheet.pdf

http://www.addedbytes.com/cheat-sheets/sql-server-cheat-sheet/

Session 4 Lab

 CLR Integration Download from Course Materials Site (to copy/paste scripts) or type manually: http://tinyurl.com/utssql2009

3 things …

 EricPhan @ssw.com.au

 http:// ericphan.info

 twitter.com/ ericphan

3 things …

 mehmet @ssw.com.au

 http:// blog.ozdemir.id.au

 twitter.com/ mozdemir_au

Thank You!

Gateway Court Suite 10 81 - 91 Military Road Neutral Bay, Sydney NSW 2089 AUSTRALIA ABN: 21 069 371 900 Phone: + 61 2 9953 3000 Fax: + 61 2 9953 3105 [email protected]

www.ssw.com.au