SQL脚本制作转化成的一些BUG

2021-03-17 12:42 jianzhan
微软公司的SQL脚本制作转化成令我伤过了心……我一直认为就是我的程序上的难题,或是我实际操作上的出错,而且,在线客服务工作人员屡次抱怨我的程序bug,数次检测以后,靠,原先全是微软公司搞的鬼…… SqlServer的脚本制作转化成有很多系统漏洞,常常由它转化成的脚本制作运作起來却有不正确。下边举例说明表明

SQL脚本制作转化成的一些BUG

微软公司的SQL脚本制作转化成令我伤过了心……我一直认为就是我的程序上的难题,或是我实际操作上的出错,而且,在线客服务工作人员屡次抱怨我的程序bug,数次检测以后,靠,原先全是微软公司搞的鬼……
Sql Server 的脚本制作转化成有很多系统漏洞,常常由它转化成的脚本制作运作起來却有不正确。下边举例说明表明:
1、并沒有依据sysdenpends的依靠关联转化成SQL编码,只是依据“优先选择级”(呵呵呵,说白了的优先选择级)来转化成。
例如:他觉得view的优先选择级就需要比function高。那麼,我写了下边的检测程序,产生以下的依靠关联:fnT1  -- vwT1  -- fnT2便是,view vwT1处在依靠的正中间。
Create function fnT1()
Returns Integer
As
begin
Return 123
end
go

Create view vwT1
As
Select aa=dbo.fnT1()

Go

Create function fnT2()
Returns Table
As
Return (Select * From vwT1)
Go
-------------------------------------
运作到数据信息库以后,用Enterprise转化成SQL编码。(选择项不一样,会出现所不一样,也没有选数据信息库和客户的)
-----------------------------------------------------------------------------------
if exists (select * from dbo.sysobjects where id = object_id(N [dbo].[fnT1] ) and xtype in (N FN , N IF , N TF ))
drop function [dbo].[fnT1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N [dbo].[fnT2] ) and xtype in (N FN , N IF , N TF ))
drop function [dbo].[fnT2]
GO

if exists (select * from dbo.sysobjects where id = object_id(N [dbo].[vwT1] ) and OBJECTPROPERTY(id, N IsView ) = 1)
drop view [dbo].[vwT1]
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

Create view vwT1
As
Select aa=dbo.fnT1()

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

Create function fnT1()
Returns Integer
As
begin
Return 123
end

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

Create function fnT2()
Returns Table
As
Return (Select * From vwT1)

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO
-----------------------------------------------------------------------------
呵呵呵,一眼你也就能看出去了,创建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
------------------------------------------------------------------------
Create Proc spB1
As
Return 11

Go

Create proc spA1
As
Begin
Declare @i int
Exec @i=spB1
Return @i*2
End
Go
-------------------------------------------------------------------------
转化成的脚本制作就为:
-------------------------------------------------------------------------
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
嘻嘻。大伙儿这答复当搞清楚我有意取名为spA1,spB1原因了。由于假如沒有依靠关联得话,A当然排到B前边,你看看微软公司并不便是那么做的么?
呵呵呵,发觉微软公司的工程项目师有时候候也罢笨……:),你看看spA1就创建在spB1的前边,而并不是它的具体关联(她压根沒有在sysdepends里边写)
幸亏这一bug还并不是非常大,如何说SP還是创建了起來。


诸位有兴趣爱好的能够试一下其他,例如sp与fn,sp Group这些,我懒:)。  共享到:
文中"SQL脚本制作转化成的一些BUG"由远航网站站长搜集梳理而成,仅作大伙儿学习培训与参照应用。大量网站建设实例教程尽在远航网站站长站。