2010-10-26 5 views
4

Je suis sur le point de convertir une procédure stockée de pl/sql en SQL Server. La procédure utilise un curseur pour parcourir les résultats d'une requête select. Existe-t-il un SQL Server équivalent à la construction ORACLE rowtype?Équivalent de type RowType dans SQL Server

+0

Si vous pouvez jeter un peu plus d'informations ici, nous pourrions être en mesure de vous aider à éviter un curseur tous ensemble, je tends juste éloigner de l'ancien « ne le font pas de cette façon » type de réponse :) – keith

Répondre

4

La façon dont SQL d'utiliser un curseur est illustré ci-dessous

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

Et c'est lent. Évitez les curseurs autant que vous le pouvez - ce qui signifie réécrire le sp;) – TomTom

+0

La vitesse n'est pas une préoccupation. La procédure sera exécutée tous les soirs lorsque les systèmes sont hors ligne. –

+0

Je voudrais éviter de déclarer autant de variables, car la table compte plus de 40 champs ... –

9

Ceci est une raison énorme de ne pas aimer SQL Server par rapport à Oracle.

Je suis tellement déçu que SS n'a pas% TYPE et% ROWTYPE. Ceux-ci économisent des heures de travail lors de l'écriture initiale du code et dans le cas où le type d'une colonne doit changer, cela évite d'avoir à revenir en arrière et à retravailler tout le code.

Dans Oracle, je l'habitude d'écrire quelque chose comme:

@MyRowVar DECLARE AS ATableau% ROWTYPE;

Dans SQL Server, je viens d'avoir à écrire ce ceci:

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; 

Cela me rend très triste.

Harvey

Questions connexes