SQL Server中的%Rowtype等效项

Luc*_*ini 5 sql sql-server oracle stored-procedures

我要将存储过程从pl/sql转换为SQL Server.该过程使用游标循环select查询结果.是否有与ORACLE rowtype构造等效的SQL Server ?

Har*_*nch 18

与oracle相比,这是一个不喜欢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;
Run Code Online (Sandbox Code Playgroud)

这让我非常伤心.

哈维


kei*_*ith 5

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
Run Code Online (Sandbox Code Playgroud)

参考链接

  • 而且速度很慢。尽可能避免使用游标 - 这意味着重写 sp ;) (2认同)

Pio*_*ień 5

作为@HarveyFrench回应,没有@rowtype。生成所有列变量您可以使用此选择并从结果中复制粘贴:

SELECT 'DECLARE @customPrefix' + COLUMN_NAME  + '  ' +  DATA_TYPE + ';'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'Your_table' 
Run Code Online (Sandbox Code Playgroud)