SQL Server 2005 降轉到 SQL Server 2000

出自 ProgWiki
前往: 導覽搜尋

SQL Server 2005 降轉到 SQL Server 2000

在函數內非法使用 getdate()

  • 起因:
SQL Server 2005 可以在預存程序或預存函數裡, 可以直接使用 getdate() ,
可是在SQL Server 2000卻會變成在函數內非法使用 getdate()
  • 解法
  1. 使用View取得getdate()的值
-- 物件:  View [dbo].[v_getdate]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[v_getdate]') AND OBJECTPROPERTY(id, N'IsView') = 1)
EXEC dbo.sp_executesql @statement = N'create   view   [dbo].[v_getdate]  
  as  
  select   date=getdate()  
' 
GO
 
 
-- 物件:  UserDefinedFunction [dbo].[getdate2]
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[getdate2]') AND xtype in (N'FN', N'IF', N'TF'))
BEGIN
execute dbo.sp_executesql @statement = N'   
 CREATE FUNCTION  [dbo].[getdate2] ()  
RETURNS datetime AS  
BEGIN 
	declare   @today   datetime  
	select   @today   =   date   from   v_getdate  
	return @today
END
' 
END
GO
  1. 在預存程序或預存函數裡, 使用 @time_now 來取代 getdate()
declare @time_now as datetime; 
set @time_now = [dbo].[getdate2]();

varchar(max) 與 nvarchar(max)

  • 用 varchar(8000) 取代 varchar(max)
  • 用 nvarchar(4000) 來取代 nvarchar(max)

最大資料列的大小超過8060Byte

  • 起因:

警告: 雖已建立資料表,但其最大資料列的大小已超過單列所允許的最大位元組數目 (8060)。如果在此資料表中 INSERT 或 UPDATE 資料行而會導致資料列長度超過 8060 位元組時,則會導致 INSERT 或 UPDATE 失敗。

  • 解法:
目前無比較好的解法, 只有把單筆的資料砍短一點了...

rank 為無法識別的 函數名稱

  • rank 為 MS-SQL 2005以後才有的T-SQL語法,主要用於資料分頁時使用。故需改寫成使用SQL夾擠式分頁方式。
參照:SQL#MS-SQL_Type_B