39
SQL Server 2008 for Developers UTS Short Course

SQL Server - CLR integration

Embed Size (px)

DESCRIPTION

How to write a stored procedure in C#. When to do it and when not to do it

Citation preview

SQL Server 2008 for DevelopersUTS Short Course

Specializes in

C# and .NET (Java not anymore)

TestingAutomated tests

Agile, ScrumCertified Scrum Trainer

Technology aficionado • Silverlight• ASP.NET• Windows Forms

Peter Gfader

Course Timetable & Materials

http://www.ssw.com.au/ssw/Events/2010UTSSQL/

Resources

http://sharepoint.ssw.com.au/Training/UTSSQL/

Course Website

Course OverviewSession

Date Time Topic

1Tuesday23-02-2010

18:00 - 21:00

SQL Server 2008 Management Studio

2Tuesday02-03-2010

18:00 - 21:00

T-SQL Enhancements

3Tuesday09-03-2010

18:00 - 21:00

High Availability

4Tuesday16-03-2010

18:00 - 21:00

CLR Integration

5Tuesday23-03-2010

18:00 - 21:00

Full-Text Search

?

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

What we did last weekHigh availability

Homework?

SQL 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

Agenda - CLR Integration

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

What is .NET?

IL = Intermediate Language

CLR = Runtime

.NET Overview

CLR

Common Language Runtime

= Virtual machine

Evolution

The whole .NET FX

http://shrinkster.com/1515 (PDF Poster)

.NET Framework

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

What is CLR Integration?

SQL CLR Project

You can do the same thing as SQL Server using .NET

code

Stored Procedures

Triggers

User-defined functions

User-defined types

Aggregate functions

CLR Integration

Enabled on an instance (not per database)

SQL Script

Execute sp_configure ‘clr enabled’, ‘1’

reconfigure

Server - Enabling CLR Integration

Stored Procedures

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()); } }

Sample

1. Enable CLR

2. Create a new database project in Visual Studio

3. Create a new stored procedure in Visual Studio

4. Connect to current context using “Context

Connection=true”

5. Add a simple SELECT statement

6. Deploy and run it

What you do

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

Internals

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

Security Levels

Custom CLR Functions

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}))$"); }};

Sample

1. Create IsValidPostCode in C# (.NET)

2. Deploy it to SQL Server

3. Run it

What you do

What is the difference?

Function

Base functionality Independent of Database itself

Stored procedure

Many operations at once Normally database specific

Stored procedure vs. Function

Triggers

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

1. Create EmailTrigger in C# (.NET)

2. Deploy it to SQL Server

3. Test it

What you do

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 (Continued)

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: Pros

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 (Continued)

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

CLR Integration: Cons

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

When to use CLR Integration

CLR Integration

The Bottom Line

• Use T-SQL for all data operations

• Use CLR assemblies for any complex calculations and transformations

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/

Quick tips

CLR Integration

Download from Course Materials Site (to copy/paste scripts) or type manually:

http://tinyurl.com/utssql2009

Session 4 Lab

3 things…

[email protected]

u

http://

peitor.blogspot.com

twitter.com/peitor

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]