SQL自定义函数问题

livesoft 2011-05-06 05:20:45
如果使用自定义函数返回一个值,进行查询的时候就很方便,但是严重影响查询效率,请问有什么好的解决方案替代?
CREATE TABLE tb_Test
(
t_id INT IDENTITY(1,1) PRIMARY KEY,
userName NVARCHAR(20)
)
GO
INSERT INTO tb_Test
SELECT '张三' UNION ALL
SELECT '李四' UNION ALL
SELECT '王二'
GO
CREATE FUNCTION f_result(@userName NVARCHAR(20))
RETURNS NVARCHAR(100)
AS
BEGIN
RETURN @userName+'A'
END
GO
SELECT t_id,userName,dbo.f_result(userName) AS FunResult FROM tb_Test
t_id userName FunResult
----------- -------------------- ----------------------------------------------------------------------------------------------------
1 张三 张三A
2 李四 李四A
3 王二 王二A

(3 行受影响)

================================================================================
上面举的一个例,如果想实现上面的查询,使用自定义函数就很方便,但速度就存在问题了。
自定义函数里面的逻辑很复杂的,还有很多地方要用到这个返回值。
想用存储过程返回值但不能实现像函数那样查询。用视图又不知道怎么传参数。
...全文
153 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 livesoft 的回复:]
我的意思就是假如一个系统会使用到一个值,很多查询的地方都会用到,这个值需要经过一个较复杂的查询才能得到,如果使用自定义函数就很好解决这个问题,用自定义函数返回这个值,但自定义函数查询的时候效率很低。
如果不用自定义函数,每次用到这个值的时候重新写一次这个复杂的查询不是很不方便?


引用 17 楼 qianjin036a 的回复:
引用 16 楼 livesoft 的回复:
都没看明白……
[/Quote]
觉得楼主对程序逻辑的理解有偏差.
自定义函数复杂,但那是你要用的逻辑,再复杂也得做.
既然有自定义函数来实现你的逻辑,但你又不想用它,那必定要用一个其他的方式来实现这个逻辑,一般只能写入实际的查询语句中,写入的,同样是一个复杂的逻辑.
不写入查询语句中,用别的方法行不,当然有可能,比如用存储过程,可存储过程实现的是什么呢?还是你那复杂的逻辑.
所以,用自定义函数实现你的需求是最直接最简便的,除非你简化你的逻辑.
我让你给出表结构和需求的意思,就是让大家来看看,是不是能对你的需求选择一个简化的逻辑.不这样,你说还有其他办法么?
livesoft 2011-05-13
  • 打赏
  • 举报
回复
我是想知道这一种情况怎么解决方便,而不是针对具体的

[Quote=引用 17 楼 qianjin036a 的回复:]
引用 16 楼 livesoft 的回复:
都没看明白我的意思

引用 15 楼 lk178369 的回复:
SQL code
SELECT t_id,userName,userName+N'A' AS FunResult FROM tb_Test


不采用函数,那就得改进查询语句,这都是建议.你又不给出表结构,需求,已有的查询语句和函数,让大家怎么看得明白你的意思?
[/Quote]
livesoft 2011-05-13
  • 打赏
  • 举报
回复
我的意思就是假如一个系统会使用到一个值,很多查询的地方都会用到,这个值需要经过一个较复杂的查询才能得到,如果使用自定义函数就很好解决这个问题,用自定义函数返回这个值,但自定义函数查询的时候效率很低。
如果不用自定义函数,每次用到这个值的时候重新写一次这个复杂的查询不是很不方便?

[Quote=引用 17 楼 qianjin036a 的回复:]
引用 16 楼 livesoft 的回复:
都没看明白我的意思

引用 15 楼 lk178369 的回复:
SQL code
SELECT t_id,userName,userName+N'A' AS FunResult FROM tb_Test


不采用函数,那就得改进查询语句,这都是建议.你又不给出表结构,需求,已有的查询语句和函数,让大家怎么看得明白你的意思?
[/Quote]
-晴天 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 livesoft 的回复:]
都没看明白我的意思

引用 15 楼 lk178369 的回复:
SQL code
SELECT t_id,userName,userName+N'A' AS FunResult FROM tb_Test
[/Quote]

不采用函数,那就得改进查询语句,这都是建议.你又不给出表结构,需求,已有的查询语句和函数,让大家怎么看得明白你的意思?
livesoft 2011-05-11
  • 打赏
  • 举报
回复
都没看明白我的意思
[Quote=引用 15 楼 lk178369 的回复:]
SQL code
SELECT t_id,userName,userName+N'A' AS FunResult FROM tb_Test
[/Quote]
livesoft 2011-05-09
  • 打赏
  • 举报
回复
如果用联接的话,如果就一个查询还可以,关键是这个自定义函数返回的内容很多查询都会用到,如果每个地方都联接查询的话很麻烦。
[Quote=引用 10 楼 orchidcat 的回复:]
引用 8 楼 livesoft 的回复:

谢谢,
你们应该没明白我的意思,我只是举个简单例子,自定义函数里面是逻辑都比较复杂,涉及的表都是4、5张。


多张表的话,联接的方式,LZ试试看。
[/Quote]
Mr_Nice 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 livesoft 的回复:]

谢谢,
你们应该没明白我的意思,我只是举个简单例子,自定义函数里面是逻辑都比较复杂,涉及的表都是4、5张。
[/Quote]

多张表的话,联接的方式,LZ试试看。
livesoft 2011-05-09
  • 打赏
  • 举报
回复
加N是解决中文乱码问题
[Quote=引用 5 楼 nplgcsdn 的回复:]
问个菜菜的问题:
userName+N'a'

userName+'a'
说明区别?
[/Quote]
livesoft 2011-05-09
  • 打赏
  • 举报
回复
谢谢,
你们应该没明白我的意思,我只是举个简单例子,自定义函数里面是逻辑都比较复杂,涉及的表都是4、5张。
lk178369 2011-05-09
  • 打赏
  • 举报
回复
SQL code
SELECT t_id,userName,userName+N'A' AS FunResult FROM tb_Test
livesoft 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 maco_wang 的回复:]
数据量大的时候不建议使用自定义函数
[/Quote]
所以寻求替代方案
叶子 2011-05-09
  • 打赏
  • 举报
回复
数据量大的时候不建议使用自定义函数
linchb_ 2011-05-07
  • 打赏
  • 举报
回复
自定义函数中如果涉及到表的话,效率很定不会高的,如果不涉及到表,效率应该不会太差的
ly745455 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL code
SELECT t_id,userName,userName+N'a' AS FunResult FROM tb_Test
[/Quote]
+++
nplgcsdn 2011-05-07
  • 打赏
  • 举报
回复
问个菜菜的问题:
userName+N'a'

userName+'a'
说明区别?
xiangyehpu 2011-05-06
  • 打赏
  • 举报
回复
楼上的大牛们都回完了,能蹭点分不?
--小F-- 2011-05-06
  • 打赏
  • 举报
回复
SELECT t_id,userName,userName+N'a' AS FunResult FROM tb_Test  
cd731107 2011-05-06
  • 打赏
  • 举报
回复
SELECT t_id,userName,userName+N'A' AS FunResult FROM tb_Test 
SQL77 2011-05-06
  • 打赏
  • 举报
回复
SELECT t_id,userName,userName+'a' AS FunResult FROM tb_Test

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧