[英]%Rowtype equivalent in SQL Server
我即將將存儲過程從 pl/sql 轉換為 SQL Server。 該過程使用游標循環select
查詢的結果。 是否有與 ORACLE rowtype
構造等效的 SQL Server?
與 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;
這讓我非常難過。
哈維
使用游標的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
正如@HarveyFrench
回應的那樣,沒有@rowtype
。 要生成所有列變量,您可以使用此選擇並從結果中復制粘貼:
SELECT 'DECLARE @customPrefix' + COLUMN_NAME + ' ' + DATA_TYPE + ';'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'Your_table'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.