程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL腳本生成的一些BUG(2)

SQL腳本生成的一些BUG(2)

編輯:關於SqlServer
從上面你一眼就可以看出來了,建立vIEw要比建立function先,而不是根據依賴關系建立。毫無疑問,將會得到如下的嚴重的錯誤:

服務器: 消息 208,級別 16,狀態 1,過程 vwT1,行 4

對象名 'dbo.fnT1' 無效。

服務器: 消息 208,級別 16,狀態 1,過程 fnT2,行 5

對象名 'vwT1' 無效。

2. 作業腳本

這個我就不說了,bug還不是很嚴重,主要是中文“——”注釋符的問題。英文版我沒有測試過,不過猜想應當沒有這個bug,大家可以試試看。

3. 還有一個SP的問題

spGetIDStr和spAnalyseStrList的關系,是後者依賴於前者。可是spGetIDStr我並沒有調用任何的表,因此,每當運行SQL Server生成的腳本的時候,總是報告類似這樣的信息:

spGetIDStr並不存在,無法在sysdepends裡建立依賴關系,存儲過程spAnalyseStrList仍然建立。無論我手工修改其建立順序或是別的方面,用它生成的腳本就是有錯。這裡,再看看第三個bug,看我下面的測試程序:

(原理:當sp沒有對表或視圖等數據庫對象有依賴關系時,sp被別的sp引用時也將無法建立依賴關系)

形成依賴關系:spB1 <--- spA1

_NOBR> _CODE>create proc spB1
as
return 11

go

create proc spA1
as
begin
declare @i int
exec @i=spB1
return @i*2
end
go_CODE>

_NOBR>

生成的腳本就為:

_NOBR> _CODE>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spA1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[spA1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spB1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[spB1]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


Create proc spA1
As
Begin
Declare @i int
Exec @i=spB1
Return @i*2
End

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

Create Proc spB1
As
Return 11


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO_CODE>

_NOBR>

現在,大家應當明白我故意命名為spA1,spB1緣故了。因為如果沒有依賴關系的話,A自然排在B前面,你看微軟可不就是這麼做的麼?幸好這個bug還不是很大,怎麼說SP還是建立了起來。

各位有興趣的可以試試別的,比如sp與fn,sp Group等等。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved