日期:2014-05-17  浏览次数:20442 次

sql2005自定义函数中不允许执行拼接的SQL语句,是否可以创建clr 函数传入sql 并返回string?
--执行如下函数时,会提示 只有函数和扩展存储过程才能从函数内部执行。
CREATE  function [dbo].[f_get_yzmc](@zdy nvarchar(2000),@yzid BIGINT)
returns VARCHAR(2000)  
as
begin
 declare @yzmc VARCHAR(2000) , @sql nVARCHAR(4000)
 SET @sql=N'select @yzmc=('+@zdy+') from v_ys t2 where t2.id=@yzid'
 EXEC sp_executesql @stmt = @sql,@params = N'@yzmc VARCHAR(2000) out,@yzid bigint  ', @yzmc=@yzmc,@yzid=@yzid
 return @yzmc
end

sql2005自定义函数中不允许执行拼接的SQL语句,是否可以创建clr 函数传入sql 并返回string?
如果可以,请给个例子,谢谢!
------解决方案--------------------
在函数中确实不可以执行动态创建的语句。

你说的clr返回string,这个是可以的
------解决方案--------------------
对了 ,这个@zdy的值是怎样的呢,看看是否不需要创建动态语句来实现呢
------解决方案--------------------
如果实在要用clr函数,可以参考一下这个例子:

SQL SERVER 2005 CLR集成之简单SQL函数
http://developer.51cto.com/art/200910/158170.htm
------解决方案--------------------
引用:
Quote: 引用:

对了 ,这个@zdy的值是怎样的呢,看看是否不需要创建动态语句来实现呢

@zdy 主要是是 v_ys表(数据量大)中的列的拼接,我要实现的目的是根据条件,取不同的自定义的列拼接个数或顺序,类似公式。
如我在b表中列(类别,公式)公式列存储的内容类似:t2.列1+t2.列2,等等,每个类别不一样
我执行select clr函数(b.公式)as mc from v_ys t2,b 
where t2.类别=b.类别
用存储过程感觉不行,v_ys表行数太多




确实,这个用存储过程来实现是不行的,相当于你要对于每个数据,都要通过这个函数,直接返回一个字符串对吧。

那就先用c#创建一个clr函数,然后通过这个clr,再创建一个普通的函数,调用这个函数,来实现你的需求。

具体这个clr函数,就是传入一个字符串,然后在clr中动态拼接一个sql,然后通过连接数据库,执行sql,返回结果。
------解决方案--------------------
引用:
clt函数中可以直接获取当前数据库的连接吗?如果不能,那就必须传一个连接信息的字符串参数了吧?


估计不行,可能得传入一个连接字符串的。

因为一般的clr函数,都只是处理一些 更适合c#来做的,计算,字符串比较等等的操作。
------解决方案--------------------
引用:
clt函数中可以直接获取当前数据库的连接吗?如果不能,那就必须传一个连接信息的字符串参数了吧?
用CLR是一个不错的选择