Another example.
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void PerformDomainCount()
{
SqlConnection conn = new SqlConnection();
SqlDataReader reader = null;
try
{
// use "Context Connection=true" to specify that you're
// tagging along on the current connection
// if you wish you could connect to an external
// database
conn.ConnectionString = "Context Connection=true";
// You have to open the connection, which feels a little strange
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "select count(*), dbo.ExtractDomain(email) from customers group by dbo.ExtractDomain(email)";
cmd.Connection = conn;
reader = cmd.ExecuteReader();
SqlMetaData[] meta = DefineMetaData();
SqlDataRecord record = new SqlDataRecord( meta );
if ( reader.HasRows )
{
reader.Read();
Copy( reader, record );
SqlContext.Pipe.SendResultsStart( record );
SqlContext.Pipe.SendResultsRow( record );
while ( reader.Read() )
{
Copy( reader, record );
SqlContext.Pipe.SendResultsRow( record );
}
}
}
catch ( Exception exception )
{
SqlContext.Pipe.Send( "ERROR: " + exception.Message );
}
finally
{
// Close all
reader.Close();
conn.Close();
if ( SqlContext.Pipe.IsSendingResults )
{
SqlContext.Pipe.SendResultsEnd();
}
}
}
private static SqlMetaData[] DefineMetaData()
{
SqlMetaData[] meta = new SqlMetaData[2];
meta[0] = new SqlMetaData( "Count", SqlDbType.Int );
meta[1] = new SqlMetaData( "Domain", SqlDbType.NVarChar, 50 );
return meta;
}
private static void Copy(SqlDataReader reader, SqlDataRecord record)
{
record.SetSqlInt32( 0, reader.GetSqlInt32( 0 ) );
record.SetSqlString( 1, reader.GetSqlString( 1 ) );
}
}