我们之前做的一个项目 , 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分 求各位大拿指点个方向。。。 跪谢了
我试过用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
谢谢 不过这种方法我已经试过了。 即使是像你这样使用CLR Function,在function里依然不能调用使用了insert update之类语句的存储过程。
@魔间行者: 我虽然没有试过在这个CLR方法里写和DB相关的语句进行测试,但是应该可以的啊,就当它是一个DAO层的方法,把DB的连接什么的都写好,平时DAO层的方法怎么操作DB它就怎么操作,你看看这样行么?你说它不能调用insert,update之类的存储过程语句...他提示什么错误了吗?
@hoxfeek: 提示错误信息具体记不清了 不过那个提示信息跟你直接在sql server里执行包含insert update或delete的function报的错是一样的。
Sql2008不是有自增列么?直接修改那列成自增的不就行了?为啥要调用CLR存储过程?
是这样的。 之前数据持久层是以oracle的方式写的。 现在我们的任务是只改数据库移植 不改DAO。 以前是写的一个C#方法 传入oracle Seq的名称 在这个方法里去取Seq.nextval. 我们在这个方法里做了判断 如果是oracle就取seq.nextval 如果是sql server 就调用存储过程 取我那个表中存的序列值+1。 这样我们前端的代码完全不用修改。
你数据量这么大,不然的直接写个程序重新从oracle读数据再写到sql2008里,这样数据比较干净
很神奇,关注中...