博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL表函数的BUG
阅读量:6633 次
发布时间:2019-06-25

本文共 842 字,大约阅读时间需要 2 分钟。

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

表函数代码

USE [EXTest]GO/****** Object:  UserDefinedFunction [dbo].[Test]    Script Date: 02/06/2015 17:16:58 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION [dbo].[Test] (	)RETURNS Table ASReturn( 	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 *,将其写成具体的字段。

转载请注明出处。

转载于:https://www.cnblogs.com/sparkleDai/p/7604971.html

你可能感兴趣的文章
memset函数具体说明
查看>>
JavaScript可否多线程? 深入理解JavaScript定时机制
查看>>
Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)...
查看>>
实用国际(XX)计量单位表
查看>>
OJ2.0userInfo页面Modify逻辑bug修复,search功能逻辑实现
查看>>
使用反射动态创建类型实例
查看>>
配置SQL Server 2008 R2 Reporting Services
查看>>
WebServices中Xml的序列化
查看>>
[转]测试的三重境界
查看>>
share
查看>>
C#高性能大容量SOCKET并发(转)
查看>>
如何在MyEclipse中将项目部署Tomcat
查看>>
【Stage3D学习笔记续】真正的3D世界(四):空间大战雏形
查看>>
Nginx学习之一-第一个程序Hello World
查看>>
gulp browser-sync自动刷新插件
查看>>
xpress for node 路由route几种实现方式
查看>>
【转】想要成功,请记住!
查看>>
ashx的学习
查看>>
[Linux] Ubuntu下非常给力的下载工具
查看>>
通用超级强大的基于Oracle数据库的代码生成器
查看>>