设为首页 加入收藏

TOP

SQL表函数的BUG
2015-07-24 11:18:17 来源: 作者: 【 】 浏览:3
Tags:SQL 函数 BUG

SQL2008之后的版本提供了表函数的编程,这是一个非常好用的功能,但是却有一个很掉蛋的问题。当我们在函数中使用SELECT * 与其他表连接的时候,如果在原表中增加了新的字段,这时得出的结果会错位。示例代码如下

表函数代码

?

USE [EXTest]
GO
/****** Object:  UserDefinedFunction [dbo].[Test]    Script Date: 02/06/2015 17:16:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[Test] 
(
	
)
RETURNS Table 
AS
Return
( 
	SELECT * FROM dbo.A
	LEFT JOIN  	
	dbo.C
	ON  
	A.AID=C.CID         
)

表A字段为AID和AName,表C的字段为CID和CDemo。执行结果如下图。

?

\

可以看到执行结果,表A和表B已经连接在一起。现在我们在表A增加一个字段AT。这时再执行表函数,得到如下结果。

\

会看到,CID和CDemo的数据错位了!!!这样的后果相当严重。因为项目运行之后,有可能需要增加字段,而这一字段的增加,得到这样错位的数据,那后果极度严重。

那怎么办?

分析可能的原因,是因为函数的SELECT * 在生成函数的时候,SQL有进行预优化的处理。当我们新增了字段后,函数保持了上一次的预优化结果,导致数据错位。

解决方法:

1.在新增字段后,每个相应的函数都重新执行一次。(这个相当废力,而且很可能出错)

2.使用VS的数据库架构同步工具,做一个备份的库,然后在该备份库上增加字段,之后同步到正式库中。这样会自动执行相关的函数。

3.避免使用SELECT *,将其写成具体的字段。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql基础操作、sql技巧和sql的常.. 下一篇Oracle阻塞(blockingblocked)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·你必须要弄懂的多线 (2025-12-25 04:22:35)
·如何在 Java 中实现 (2025-12-25 04:22:32)
·Java【多线程】单例 (2025-12-25 04:22:29)
·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)