需要在数据库存储过程调用一个比较一个已经基本完成的算法; 用SQL另写一个存储过程比较复杂,被迫要使用CLR. 也早该研究一下CLR了。在网上搜了一通, 发现http://www.diybl.com/course/7_databases/sql/sqlServer/20091028/180407.html 文章不错, 不过该文非原创,尊重灰太郎大人的原创成果,搜到了该文的最初位置如下。
以下内容转自:http://blog.csdn.net/tjvictor/archive/2009/10/26/4731052.aspx
SqlContext.Pipe.Send是向客户端发送一条结果,SqlContext.Pipe.ExecuteAndSend是执行一条语句。
下面我将用几个实际的简单例子来说明如何使用这几个方法。
1.使用SqlContext.Pipe.Send构建无参无返回值的存储过程
[Microsoft.SqlServer.Server.SqlProcedure]
public static void USP_SayHello()
{
SqlContext.Pipe.Send("USP:Hello TJVictor!");
}
2.使用SqlContext.Pipe.Send构建带参无返回值的存储过程
[Microsoft.SqlServer.Server.SqlProcedure]
public static void USP_SayHelloByParameter(SqlString msg)
{
SqlContext.Pipe.Send(msg.ToString());
}
3.使用SqlContext.Pipe.Send构建带参有返回值的存储过程
[Microsoft.SqlServer.Server.SqlProcedure]
public static SqlInt32 USP_SayHelloByReturn(SqlString msg)
{
return msg.ToString().Length;
}
4.使用SqlCommand来执行语句,注意这里使用了SQL Server自带的pubs数据库
[Microsoft.SqlServer.Server.SqlProcedure]
public static void USP_ExecuteBySqlCommand(SqlString stor_id, SqlString stor_name)
{
//由于程序是在SQL Server内执行,所以连接字符串写成"context connection=true"即可
using (SqlConnection con = new SqlConnection("context connection=true"))
{
con.Open();
SqlCommand com = new SqlCommand(
string.Format("insert into stores values('{0}','{1}')", stor_id, stor_name), con);
com.ExecuteNonQuery();
}
}
5.使用ExecuteAndSend来执行语句,注意这里使用了SQL Server自带的pubs数据库
[Microsoft.SqlServer.Server.SqlProcedure]
public static void USP_ExecuteByExecuteAndSend(SqlString stor_id, SqlString stor_name)
{
//由于程序是在SQL Server内执行,所以连接字符串写成"context connection=true"即可
using (SqlConnection con = new SqlConnection("context connection=true"))
{
con.Open();
SqlCommand com = new SqlCommand(
string.Format("insert into stores values('{0}','{1}')", stor_id, stor_name), con);
SqlContext.Pipe.ExecuteAndSend(com);
}
}
4和5的执行结果一样,但是在CLR中推荐使用方式5,这是将结果返回到客户端的最高效方法,因为数据不必复制到托管内存即传输到网络缓冲区。
6.使用PipeSend来发送单条记录
[Microsoft.SqlServer.Server.SqlProcedure]
public static void UPS_PipeSendSqlDataRecord()
{
//像构造Table一样来构造SqlDataRecord,其中SqlMetaData类似DataColumn
SqlDataRecord dataRecord = new SqlDataRecord(new SqlMetaData[] {
new SqlMetaData("Col1", SqlDbType.NVarChar,100),
new SqlMetaData("Col2", SqlDbType.Int)
});
for (int count = 1; count < 5; count++)
{
//SqlDataRecord.SetString类似DataRow的功能,像Table中填充值
dataRecord.SetString(0, count.ToString());
dataRecord.SetInt32(1, count);
//通过Send来发送
SqlContext.Pipe.Send(dataRecord);
}
}
7.使用PipeSendResult来发送结果集
[Microsoft.SqlServer.Server.SqlProcedure]
public static void UPS_PipeSendResultSqlDataRecord()
{
//像构造Table一样来构造SqlDataRecord,其中SqlMetaData类似DataColumn
SqlDataRecord dataRecord = new SqlDataRecord(new SqlMetaData[] {
new SqlMetaData("Col1", SqlDbType.NVarChar,100),
new SqlMetaData("Col2", SqlDbType.Int)
});
//开始填充
SqlContext.Pipe.SendResultsStart(dataRecord);
for (int count = 0; count < 5; count++)
{
//SqlDataRecord.SetString类似DataRow的功能,像Table中填充值
dataRecord.SetString(0, count.ToString());
dataRecord.SetInt32(1, count);
//通过SendResultsRow把数据填充到Table,相关于Table.Rows.Add(DataRow);
SqlContext.Pipe.SendResultsRow(dataRecord);
}
//填充结束,返回结果集
SqlContext.Pipe.SendResultsEnd();
}
其中6与7的不同在于:6返回5个结果集,其中每个结果集只有一条数据。7返回一个结果集,里面有5条数据。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tjvictor/archive/2009/10/26/4731052.aspx