Using .net assemblies inside SQL Server: Quick start guide

Are you are an experienced .net programmer and you are too lazy to learn TSQL stored procedures, triggers or functions? Yes? Then read on this quick start guide on using .net assemblies inside SQL Server using SQLCLR.

SQLCLR (or SQL Common Language Runtime) is a technology for hosting of the .NET CLR engine inside SQL Server. This allows managed code, written in any .net language, to be hosted and run in the SQL Server environment. This technology is available in SQL Server 2005 or 2008 and allows you to create Stored Procedures, Triggers (for DML or DDL statements), UDFs, UDTs or even User-defined types, which allows you to create simple or complex data types which can be serialized or deserialized within the Database.
[ad#468×60]
Now, the example. I used Visual C# 2008 and SQLServer 2008 Express x64, but this example should work with 2005 editions as well. Remember, this is just a quick start guide, so the example is very simple.

Then create a new assembly (class library) project in Visual C# and name it tryExceptSQLCLR. Start by adding the following assemblies:

using Microsoft.SqlServer.Server;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;

(we won’t be using all of them, but these are the ones you will normally need for SQLCLR integration)


Now lets start by creating a new Stored Procedure. This (useless) SP will use an input string and return the string length. SP’s are created as static methods, as SQLServer will not instantiate your class. Return type must always be Void, as all the SP result must be channeled via the SqlContext.Pipe class.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void CountStringLength(String inputString)
{
   SqlContext.Pipe.Send(inputString.Length.ToString());
}

SQLCLR recognizes the CountStringLength as a SP using the Microsoft.SqlServer.Server.SqlProcedure attribute. Pipe.Send also allows you to return SqlDataRecord objects or even full SqlDataReader result sets, but for the sake of simplicity, lets just return the string length as a string for now.

Build the assembly and that’s it, our new SP is ready! Now, create a new database in SQL Server and run the following TSQL statement:

CREATE ASSEMBLY tryexceptAssembly 
  FROM  '(path to the compiled assembly)\tryExceptSQLCLR.dll' 
  WITH PERMISSION_SET = SAFE
go

This loads the assembly binary file into the database – this is important: the assembly is not linked/referenced from your hard-disk or GAC, its actually loaded into the MDB file, so every time you compile a new version you have to reload it using the ALTER ASSEMBLY command. Our example only needs the SAFE permission_set, as we are not accessing information outside the database and we are not using any unmanaged code inside.

Few more things to go: SQLServer does not recognize automagically all the SPs inside this assembly – we have to create them all, one by one, with the correct parameters.

CREATE PROCEDURE spCountStringLength (@inputString nvarchar(max))
AS 
EXTERNAL NAME tryexceptAssembly.[tryExceptSQLCLR.Class1].CountStringLength
go

(if you run into trouble, check out this post – MattN has done a lot of trouble shooting for us)
CREATE PROCEDURE is not required every time you reload the assembly into the database using the ALTER ASSEMBLY command – if you change your SP header (e.g. alter the input parameters, method name, etc), SQLServer will only complain when you try to EXEC the SP, so Unit Test your project to prevent this.

And, finally, before we can execute our SP, we must enable CLR in our database, as SQLCLR support is disabled by default. Run the following:

sp_configure 'clr enabled',1 
go 
reconfigure with override 
go

(this enables SQLCLR serverwide)

And voila, our SP is ready to run!

EXEC dbo.spCountStringLength N'The lazy fox... whatever'

… that returns 24, so it works.

Remember, every time you change and build your assembly you must upload it again into the database:

ALTER ASSEMBLY tryexceptAssembly 
  FROM  '(path to the compiled assembly)\tryExceptSQLCLR.dll' 
  WITH PERMISSION_SET = SAFE
go

If you want to publish your SQLCLR assembly in your newly developed product inside a DDL script do the following inside SQL Management Studio

  • Open your database (the one with the most recent assembly loaded)
  • Expand “Programmability” and “Assemblies”
  • In the context menu of your assembly (in this case tryexceptAssembly) choose the option “Script assembly as”->”Create to”->”New editor window”

This will generate the statement needed to load your assembly using DDL commands only, without hard-disk file dependencies. The statement is basically the same as you saw in the beginning, but the entire assembly binary file coded as HEX:

CREATE ASSEMBLY [tryexceptAssembly]
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103001E4DB94A0000000000000000E00002210B010800000800000006000000000000CE2700000020000000400000000040000020000000020000040000000000000004000000000000000080000000020000000000000300408500001000001000000000100000100000000000001000000000000000000000007427000057000000004000008003000000000000000000000000000000000000006000000C000000F82600001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000D4070000002000000008000000020000000000000000000000000000200000602E72737263000000800300000040000000040000000A0000000000000000000000000000400000402E72656C6F6300000C0000000060000000020000000E00000000000000000000000000004000004200000000000000000000000000000000B027000000000000480000000200050080200000780600000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000133002001900000001000011281100000A026F1200000A0A1200281300000A6F1400000A2A1E02281500000A2A00000042534A4201000100000000000C00000076322E302E35303732370000000005006C00000020020000237E00008C020000E002000023537472696E6773000000006C05000008000000235553007405000010000000234755494400000084050000F400000023426C6F620000000000000002000001471502000900000000FA0133001600000100000016000000020000000200000001000000150000000E00000001000000010000000200000000000A00010000000000060045003E000600820070000600990070000600B60070000600D50070000600EE00700006000701700006002201700006003D0170000600750156010600890156010600970170000600B00170000600E001CD013B00F40100000600230203020600430203020A0088026D020A009E026D020A00A9026D020600BA023E000600CC023E000000000001000000000001000100010010001E00250005000100010050200000000096004C000A00010075200000000086185E000F00020000000100640011005E00130019005E00130021005E00130029005E00130031005E00130039005E00130041005E00130049005E00130051005E00180059005E00130061005E00130069005E00130071005E001D0081005E00230089005E000F0091005E000F009900B1022D00A900C1023200B100D2023600A100DB02130009005E000F002000830028002E00330068002E00130053002E001B0053002E00230059002E002B003E002E000B003E002E003B0053002E004B0053002E00530089002E006300B3002E006B00C0002E007300C9002E007B00D2003A0004800000010000000000000000000000000025000000020000000000000000000000010035000000000002000000000000000000000001006102000000000000003C4D6F64756C653E0074727945786365707453514C434C522E646C6C00436C617373310074727945786365707453514C434C52006D73636F726C69620053797374656D004F626A65637400436F756E74537472696E674C656E677468002E63746F7200696E707574537472696E670053797374656D2E5265666C656374696F6E00417373656D626C795469746C6541747472696275746500417373656D626C794465736372697074696F6E41747472696275746500417373656D626C79436F6E66696775726174696F6E41747472696275746500417373656D626C79436F6D70616E7941747472696275746500417373656D626C7950726F6475637441747472696275746500417373656D626C79436F7079726967687441747472696275746500417373656D626C7954726164656D61726B41747472696275746500417373656D626C7943756C747572654174747269627574650053797374656D2E52756E74696D652E496E7465726F70536572766963657300436F6D56697369626C65417474726962757465004775696441747472696275746500417373656D626C7956657273696F6E41747472696275746500417373656D626C7946696C6556657273696F6E4174747269627574650053797374656D2E446961676E6F73746963730044656275676761626C6541747472696275746500446562756767696E674D6F6465730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300436F6D70696C6174696F6E52656C61786174696F6E734174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650053797374656D2E44617461004D6963726F736F66742E53716C5365727665722E5365727665720053716C50726F6365647572654174747269627574650053716C436F6E746578740053716C50697065006765745F5069706500537472696E67006765745F4C656E67746800496E74333200546F537472696E670053656E640000032000000000004EEF9C17A7B837438681FDDA362695DF0008B77A5C561934E089040001010E03200001042001010E042001010205200101113D042001010804010000000400001251032000080320000E030701081401000F74727945786365707453514C434C5200000501000000000E0100094D6963726F736F667400002001001B436F7079726967687420C2A9204D6963726F736F6674203230303900002901002439396364316462642D323265342D343632622D393363392D66356639366564653331303200000C010007312E302E302E3000000801000200000000000801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301000000000000001E4DB94A0000000002000000600000001427000014090000525344533E76D4B9A768514DB4FF25422CD3EFAD02000000653A5C6C69786F5C74727945786365707453514C434C525C74727945786365707453514C434C525C6F626A5C52656C656173655C74727945786365707453514C434C522E706462009C2700000000000000000000BE270000002000000000000000000000000000000000000000000000B02700000000000000000000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100100000001800008000000000000000000000000000000100010000003000008000000000000000000000000000000100000000004800000058400000280300000000000000000000280334000000560053005F00560045005200530049004F004E005F0049004E0046004F0000000000BD04EFFE00000100000001000000000000000100000000003F000000000000000400000002000000000000000000000000000000440000000100560061007200460069006C00650049006E0066006F00000000002400040000005400720061006E0073006C006100740069006F006E00000000000000B00488020000010053007400720069006E006700460069006C00650049006E0066006F00000064020000010030003000300030003000340062003000000034000A00010043006F006D00700061006E0079004E0061006D006500000000004D006900630072006F0073006F00660074000000480010000100460069006C0065004400650073006300720069007000740069006F006E0000000000740072007900450078006300650070007400530051004C0043004C0052000000300008000100460069006C006500560065007200730069006F006E000000000031002E0030002E0030002E003000000048001400010049006E007400650072006E0061006C004E0061006D0065000000740072007900450078006300650070007400530051004C0043004C0052002E0064006C006C0000005C001B0001004C006500670061006C0043006F007000790072006900670068007400000043006F0070007900720069006700680074002000A90020004D006900630072006F0073006F006600740020003200300030003900000000005000140001004F0072006900670069006E0061006C00460069006C0065006E0061006D0065000000740072007900450078006300650070007400530051004C0043004C0052002E0064006C006C000000400010000100500072006F0064007500630074004E0061006D00650000000000740072007900450078006300650070007400530051004C0043004C0052000000340008000100500072006F006400750063007400560065007200730069006F006E00000031002E0030002E0030002E003000000038000800010041007300730065006D0062006C0079002000560065007200730069006F006E00000031002E0030002E0030002E00300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000C000000D03700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
WITH PERMISSION_SET = SAFE

GO

Next time i’ll expand on this subject with more complex (and useful) examples – triggers in SQLCLR. I’ll write the article when i have some free time or when my PayPal donations reach one million dollars – whichever one comes first. (donate below :) )


Posted

in

by

Tags:

Comments

5 responses to “Using .net assemblies inside SQL Server: Quick start guide”

  1. Marcusloke888 Avatar
    Marcusloke888

    How t0 accessing the SQL Server assemblies extended properties from .NET?

  2. domoticodocabc Avatar

    buenas
    estoy creando un assembly pero me genera un error
    el erro es
    Assembly ‘datos’ references assembly ‘system.xml.linq, version=3.5.0.0, culture=neutral, publickeytoken=b77a5c561934e089.’, which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(El sistema no puede hallar el archivo especificado.)). Please load the referenced assembly into the current database and retry your request.
    en la realidad no se como solucionar el error si me podrian dar una ayuda

    gracias de antemano

    1. nelson cardenas Avatar
      nelson cardenas

      no encuentra el archivo en el servidor de base de datos recuerde que el dll debe estar en una dirección local para que funcione correctamente

      Saludos desde colombia

  3. Juan Algaba Avatar

    Nice. I was looking for the “Script assembly as” part. Many guides don’t mention that. Thanks.

  4. FAUZI Avatar
    FAUZI

    Thank you so much for this wonderful article. It has made my querying much easier

Leave a Reply to Juan AlgabaCancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Discover more from try {} except

Subscribe now to keep reading and get access to the full archive.

Continue reading