Эквивалент% Rowtype в SQL Server - PullRequest
5 голосов
/ 26 октября 2010

Я собираюсь преобразовать хранимую процедуру из pl / sql в SQL Server.Процедура использует курсор для циклического просмотра результатов запроса select.Существует ли SQL Server, эквивалентный конструкции ORACLE rowtype?

Ответы [ 3 ]

15 голосов
/ 12 мая 2015

Это серьезная причина неприязни к SQL Server по сравнению с оракулом.

Я так разочарован, что у SS нет% TYPE и% ROWTYPE. Это экономит часы работы при первоначальном написании кода и в случае необходимости изменения типа столбца, что избавляет от необходимости возвращаться и заново обрабатывать весь код.

В Oracle я писал что-то вроде:

ОБЪЯВИТЬ @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;

Это меня очень огорчает.

Harvey

4 голосов
/ 26 октября 2010

Способ использования курсора в 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

ссылка

1 голос
/ 05 февраля 2019

Когда @HarveyFrench ответил, что нет @rowtype. Сгенерировать все столбцы переменных. Вы можете использовать этот выбор и скопировать вставить из результатов:

SELECT 'DECLARE @customPrefix' + COLUMN_NAME  + '  ' +  DATA_TYPE + ';'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'Your_table' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...