【问题标题】:%Rowtype equivalent in SQL ServerSQL Server 中的 %Rowtype 等效项
【发布时间】:2011-04-30 15:55:54
【问题描述】:

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

【问题讨论】:

  • 如果您可以在此处提供更多信息,我们也许可以帮助您避免使用光标,我只是倾向于避开旧的“不要那样做”类型的答案:)

标签: sql sql-server oracle stored-procedures


【解决方案1】:

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

SELECT 'DECLARE @customPrefix' + COLUMN_NAME  + '  ' +  DATA_TYPE + ';'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
TABLE_NAME = 'Your_table' 

【讨论】:

  • 我希望我可以访问这些表格 :(
【解决方案2】:

与 oracle 相比,这是不喜欢 SQL Server 的一个重要原因。

我很失望 SS 没有 %TYPE 和 %ROWTYPE。这些在最初编写代码时节省了数小时的工作时间,并且在需要更改列类型的情况下,不必返回并重新编写所有代码。

在 Oracle 中,我曾经写过类似的东西:

将@MyRowVar 声明为 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;

这让我很伤心。

哈维

【讨论】:

  • 我希望我能投票 1000 次。我想念 PL/SQL。 SQL Server 没有 FOR 循环。
  • 是的...必须要对一个人投赞成票...但要知道我在脑海中多次投赞成票。
【解决方案3】:

使用游标的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

【讨论】:

  • 而且速度很慢。尽可能避免使用游标 - 这意味着重写 sp ;)
  • 速度不是问题。该过程将在系统离线时每晚执行。
  • 我想避免声明这么多变量,因为表有40多个字段...
猜你喜欢
  • 2023-03-07
  • 2020-07-22
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2011-03-13
  • 2021-01-26
相关资源
最近更新 更多