2010-10-26 40 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; 

这让我很伤心。

哈维