先看看怎么写SQL2005中的托管程序:
 [SqlFunction(DataAccess = DataAccessKind.Read)]
 public static string ReportSqlVersion()
 {
  SqlCommand cmd = SqlContext.GetCommand();
  cmd.CommandText = "select @@version";
  return (string)cmd.ExecuteScalar();
 }
上面是最简单的返回版本号的Function. 和ADO.net一样,通过Command执行查询。看看System.Data.SqlServer.SqlCommand的定义:
public sealed class SqlCommand : System.Data.Sql.ISqlCommand, System.Data.IDbCommand, System.IDisposable
居然也实现了System.Data.IDbCommand!

另外一个向客户端返回结果集的方法:
 ISqlReader rdr = cmd.ExecuteReader();
 SqlContext.GetPipe().Send(rdr);

看起来SQL2005中的托管程序没什么不同,只是通过System.Data.SqlServer包来读取数据库。
如果把T-SQL变成托管代码执行,然后把数据接力给外部的APP程序,看起来很罗嗦。

以前写SP的主要理由是性能,现在用了CLR之后性能大打折扣,那SQL2005中加入CLR的理由是什么呢?

我能想到的理由,欢迎各位补充:
1. 语言的通用性,抛弃蹩脚的T-SQL
2. 语言的功能(比如错误处理)
3. 动态调试
4. 利用辅助工具包,大量API
5. 把原有中间层业务逻辑全部转移到SP中(中小应用),(可选)发布成WS

缺点:
1. 负载扩充不容易
2. 瓶颈分析有困难

以后WebApp中不需要业务层封装,直接调用SP。

用Oracle也能用Java写SP封装业务逻辑,但是SQL2005中还能把他们直接发布成WS,跟SmartClient真是绝配。

posted on 2004-08-04 18:19  steeven  阅读(1132)  评论(1编辑  收藏  举报