SQL表函數的BUG,SQL表函數BUG

來源:互聯網
上載者:User

SQL表函數的BUG,SQL表函數BUG

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.ALEFT JOIN  dbo.CON  A.AID=C.CID         )

表A欄位為AID和AName,表C的欄位為CID和CDemo。執行結果如。


可以看到執行結果,表A和表B已經串連在一起。現在我們在表A增加一個欄位AT。這時再執行表函數,得到如下結果。


會看到,CID和CDemo的資料錯位了!!!這樣的後果相當嚴重。因為項目運行之後,有可能需要增加欄位,而這一欄位的增加,得到這樣錯位的資料,那後果極度嚴重。

那怎麼辦?

分析可能的原因,是因為函數的SELECT * 在產生函數的時候,SQL有進行預最佳化的處理。當我們新增了欄位後,函數保持了上一次的預最佳化結果,導致資料錯位。

解決方案:

1.在新增欄位後,每個相應的函數都重新執行一次。(這個相當廢力,而且很可能出錯)

2.使用VS的資料庫結構描述同步工具,做一個備份的庫,然後在該備份庫上增加欄位,之後同步到正式庫中。這樣會自動執行相關的函數。

3.避免使用SELECT *,將其寫成具體的欄位。

轉載請註明出處。


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.