2010-10-26 42 views
4

我即將將存儲過程從pl/sql轉換爲SQL Server。該過程使用遊標循環查詢select的結果。是否存在與ORACLE rowtype構造相同的SQL Server?%SQL Server中的Rowtype等效項目

+0

如果你可以在這裏拋出一些詳細信息,我們也許能幫助你避免光標都在一起,我只是傾向於引導遠離舊「不這樣做的」類型的答案:) – keith 2010-10-27 00:04:35

回答

4

使用遊標的SQL方法如下所示

DECLARE @colA varchar(50), @colB varchar(50) 

DECLARE myCursor CURSOR FOR 
Select columnA, columnB From table 

OPEN myCursor 

FETCH NEXT FROM myCursor INTO @colA, @colB 

WHILE @@FETCH_STATUS = 0 
BEGIN 

--do something with @colA and @colB 

FETCH NEXT FROM myCursor INTO @colA, @colB 

END 

CLOSE myCursor 
DEALLOCATE myCursor 

reference link

+2

而且速度很慢。儘可能避免光標 - 這意味着重寫sp;) – TomTom 2010-10-26 09:57:00

+0

速度不是問題。該過程將在系統處於脫機狀態時每晚執行。 – 2010-10-26 10:01:56

+0

我想避免宣佈這麼多的變量,因爲表中有超過40個字段... – 2010-10-26 10:59:56

9

這是一個巨大的原因相比,甲骨文的時候不喜歡的SQL Server。

我很失望SS沒有%TYPE和%ROWTYPE。這樣可以在最初編寫代碼時節省數小時的工作時間,並且在列的類型需要更改的情況下,無需返回並重新處理所有代碼。

在Oracle我以前寫的東西,如:

DECLARE @MyRowVar AS ATable%ROWTYPE;

在SQL Server中,我不得不寫這本:

DECLARE @External_ID    AS BIGINT = NULL; 
DECLARE @PlatformID     AS INT = NULL; 
DECLARE @ActorIDOfReseller   AS INT = NULL; 
DECLARE @ActorIDOfClient   AS INT = NULL; 
DECLARE @ActorIDOfExtension   AS INT = NULL; 
DECLARE @CallType     AS NCHAR (10) = NULL; 
DECLARE @CallInitiatedDate   AS DATE = NULL; 
DECLARE @CallInitiatedTimeHH24MI AS TIME (0) = NULL; 
DECLARE @TimePeriodID    AS INT = NULL; 
DECLARE @CallAnswered    AS DATETIME = NULL; 
DECLARE @CallAnsweredYN    AS BIT = NULL; 
DECLARE @CallDispositionID   AS INT = NULL; 
DECLARE @CountryID     AS INT = NULL; 
DECLARE @CallPrefixID    AS INT = NULL; 
DECLARE @FromNumber     AS VARCHAR (32) = NULL; 
DECLARE @ToNumber     AS VARCHAR (80) = NULL; 
DECLARE @CallDuration    AS INT = NULL; 
DECLARE @CallCostToExtension  AS DECIMAL (10, 6) = NULL; 
DECLARE @CallCostToClient   AS DECIMAL (10, 6) = NULL; 
DECLARE @CallCostToReseller   AS DECIMAL (10, 6) = NULL; 
DECLARE @CallCostToAdmin   AS DECIMAL (10, 6) = NULL; 
DECLARE @Flow      AS VARCHAR (3) = NULL; 
DECLARE @CallStart     AS DATETIME = NULL; 
DECLARE @MoneyUnit     AS VARCHAR (32) = NULL; 
DECLARE @Prefix      AS VARCHAR (32) = NULL; 
DECLARE @External_CallID   AS VARCHAR (255) = NULL; 

這讓我很傷心。

哈維