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
------解决方案--------------------
确实,这个用存储过程来实现是不行的,相当于你要对于每个数据,都要通过这个函数,直接返回一个字符串对吧。
那就先用c#创建一个clr函数,然后通过这个clr,再创建一个普通的函数,调用这个函数,来实现你的需求。
具体这个clr函数,就是传入一个字符串,然后在clr中动态拼接一个sql,然后通过连接数据库,执行sql,返回结果。
------解决方案--------------------clt函数中可以直接获取当前数据库的连接吗?如果不能,那就必须传一个连接信息的字符串参数了吧?
估计不行,可能得传入一个连接字符串的。
因为一般的clr函数,都只是处理一些 更适合c#来做的,计算,字符串比较等等的操作。
------解决方案--------------------clt函数中可以直接获取当前数据库的连接吗?如果不能,那就必须传一个连接信息的字符串参数了吧?
用CLR是一个不错的选择