首页 新闻 搜索 专区 学院

求教:在MS SQL的函数中 能否调用CLR存储过程。

0
悬赏园豆:200 [已解决问题] 解决于 2012-09-26 15:00

我们之前做的一个项目 , DB是oracle 10g, 现在需要将数据库移植到sql 2008。其间遇到几个问题。包括函数不能执行动态sql查询之类的都已通过CLR函数解决。 但是有一个取seq id的需求 始终无法搞定。

这里的设计是:建一个表 一个存储过程去模拟oracle seq取序列的功能。表中就两字段:tableName和SeqValue.每次执行存储过程 先锁表再取数然后+1 再把+1后的SeqValue update到表中记录。

由于function无法直接执行存储过程,在google了半天后听说可以执行扩展类Proc 于是到MSDN查资料。MSDN一开篇就说扩展存储过程以后会取消 推荐使用CLR存储过程。 于是写了一个CLR存储过程。 CLR存储过程已部署到库中 也可以直接执行  但是在function中执行这个东东 IDE还是提示“只有函数或扩展存储过程才能在函数内部执行”。


兄弟总共就200分  求各位大拿指点个方向。。。 跪谢了

魔间行者的主页 魔间行者 | 初学一级 | 园豆:4
提问于:2012-09-12 10:25
< >
分享
最佳答案
0

我试过用SQL Server调用C#方法..没有试过CLR存储过程,调用方法应该都差不多吧?你稍等..我去找之前的例子..给你 贴上来

 

这是步骤:

1,建立一个库类型的项目

2,被调用的方法要是public 且static 的,返回值只能为int或void

3,编译好的DLL复制到**目录下.

4,在SQL做以下操作


//启用CLR支持
exec sp_configure 'clr enabled',1   
reconfigure   
go

//注册DLL
CREATE ASSEMBLY asmHelloWorld FROM 'C:\SqlCallCsharpMethod.dll'

//创建调用函数
CREATE FUNCTION dbo.clrHelloWorld   
(   
    @name as nvarchar(200)   
)    
RETURNS nvarchar(200)   
AS EXTERNAL NAME asmHelloWorld.[SqlCallCsharpMethod.Test].HelloWho


//执行
SELECT dbo.clrHelloWorld('cnBlog')

 

你看到这里还不明白就加我QQ,553030761

收获园豆:200
hexllo | 菜鸟二级 |园豆:405 | 2012-09-12 10:31

谢谢  不过这种方法我已经试过了。 即使是像你这样使用CLR Function,在function里依然不能调用使用了insert update之类语句的存储过程。

魔间行者 | 园豆:4 (初学一级) | 2012-09-12 10:41

@魔间行者: 我虽然没有试过在这个CLR方法里写和DB相关的语句进行测试,但是应该可以的啊,就当它是一个DAO层的方法,把DB的连接什么的都写好,平时DAO层的方法怎么操作DB它就怎么操作,你看看这样行么?你说它不能调用insert,update之类的存储过程语句...他提示什么错误了吗?

hoxfeek | 园豆:370 (菜鸟二级) | 2012-09-13 16:47

@hoxfeek: 提示错误信息具体记不清了  不过那个提示信息跟你直接在sql server里执行包含insert update或delete的function报的错是一样的。 

魔间行者 | 园豆:4 (初学一级) | 2012-09-14 14:30
其他回答(3)
0

Sql2008不是有自增列么?直接修改那列成自增的不就行了?为啥要调用CLR存储过程?

webaspx | 园豆:1975 (小虾三级) | 2012-09-12 10:35

是这样的。 之前数据持久层是以oracle的方式写的。 现在我们的任务是只改数据库移植  不改DAO。 以前是写的一个C#方法 传入oracle Seq的名称  在这个方法里去取Seq.nextval. 我们在这个方法里做了判断  如果是oracle就取seq.nextval  如果是sql server  就调用存储过程  取我那个表中存的序列值+1。 这样我们前端的代码完全不用修改。

支持(0) 反对(0) 魔间行者 | 园豆:4 (初学一级) | 2012-09-12 10:44
0

你数据量这么大,不然的直接写个程序重新从oracle读数据再写到sql2008里,这样数据比较干净

jason2013 | 园豆:1998 (小虾三级) | 2012-09-12 10:51
0

很神奇,关注中...

TigerSpringLiu | 园豆:196 (初学一级) | 2012-09-12 14:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册