zoukankan      html  css  js  c++  java
  • 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 *,将其写成具体的字段。

    转载请注明出处。


  • 相关阅读:
    库函数的使用:POJ1488-TEX Quotes(getline()的使用)
    字符串:HDU3064-最长回文
    字符串:HDU5371-Hotaru's problem(manacher 的应用)
    字符串-POJ3974-Palindrome
    Oracle数据库编程:在JDBC中应用Oracle
    C++、GDAL创建shapefile文件
    CStdioFile
    Js中获取frames中的元素
    约瑟夫环问题(循环链表)
    【Oracle 函数索引】一次数据库的优化过程
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7604971.html
Copyright © 2011-2022 走看看