1. 程式人生 > >SQL SERVER 儲存過程和事務(通過兩個值自動計算第三個值並更新)

SQL SERVER 儲存過程和事務(通過兩個值自動計算第三個值並更新)

SQL SERVER 儲存過程和事務

前提:再實際業務中,有一個需求,即是根據A欄位和B欄位計算C欄位(批量的)考慮用的事務和WHILE迴圈,做成儲存過程,然後作業,定時10分鐘更新一次。其中A欄位的值,又是根據其他4個欄位為一組求的平均值。
那麼該儲存過程用到兩次事務,事務1先計算A值,事務2再計算C值。注意兩次事務的名稱應該不同,不然可能有錯誤。

USE [MSIS]
GO

/* Object: StoredProcedure [dbo].[AutoUpByLeft] Script Date: 2018/4/12 14:34:12 */
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

– =============================================
– Author: zhangaz
– Create date: 2018/4/12
– Description: 同步分級
– =============================================
CREATE PROCEDURE [dbo].[AutoUpByLeft]
AS
BEGIN
IF OBJECT_ID(‘tempdb..#TEMPAL’) IS NOT NULL
DROP TABLE #TEMPA;
IF OBJECT_ID(‘tempdb..#TEMPBL’) IS NOT NULL
DROP TABLE #TEMPB;
IF OBJECT_ID(‘tempdb..#TEMPL’) IS NOT NULL
DROP TABLE #TEMP;
–1.先求平均值
WITH DETAIL
AS ( SELECT _CRF_Variable.Name ,
_CRFDataValue.CRF_Variable_Id ,
_CRFDataValue.ContentValue ,
_CRFDataValue.CRFData_Id ,
SUBSTRING(_CRF_Variable.Name, 0, 8) AS TempName
FROM dbo.CRFDataValue AS _CRFDataValue
INNER JOIN dbo.CRF_Variable AS _CRF_Variable ON _CRF_Variable.Id = _CRFDataValue.CRF_Variable_Id
WHERE _CRF_Variable.CRFForm_Id = 1287 AND Name LIKE ‘

),TAS(SELECTCRFDataValue.Id,CRFVariable.Name,CRFDataValue.CRFVariableId,CRFDataValue.ContentValue,CRFDataValue.CRFDataId,SUBSTRING(CRFVariable.Name,0,8)ASTempNameFROMdbo.CRFDataValueASCRFDataValueINNERJOINdbo.CRFVariableASCRFVariableONCRFVariable.Id=CRFDataValue.CRFVariableIdWHERECRFVariable.CRFFormId=1287ANDNameLIKE聽力檢查%平均%左%’
AND _CRFDataValue.ContentValue != ‘[]’
)

—-1.往#TEMPA中插入資料 先查出4個術後PTA 氣導左和對應術後PTA 平均左
SELECT DETAIL.TempName AS aTempName ,
DETAIL.CRF_Variable_Id AS aCRF_Variable_Id ,
DETAIL.ContentValue AS aContentValue ,
DETAIL.CRFData_Id AS CRFData_Id ,
T.CRF_Variable_Id AS bCRF_Variable_Id ,
T.ContentValue AS bContentValue ,
DETAIL.TempName AS bTempName
INTO #TEMPAL
FROM DETAIL
INNER JOIN T ON T.CRFData_Id = DETAIL.CRFData_Id
AND T.TempName = DETAIL.TempName;
–2.往#TEMPB中插入資料
SELECT ROW_NUMBER() OVER ( ORDER BY CRFData_Id ) AS Id ,
AVG(CAST(#TEMPAL.aContentValue AS FLOAT)) AS TEMPAVG ,
bContentValue ,
CRFData_Id AS bCRFData_Id ,
bCRF_Variable_Id ,
COUNT(1) AS TEMPCOUNT
INTO #TEMPBL
FROM #TEMPAL
WHERE bContentValue IS NULL OR bContentValue=” –為空的計算平均值,已有平均值的不再計算
GROUP BY CRFData_Id ,
aTempName ,
bContentValue ,
bCRF_Variable_Id
HAVING COUNT(1) > 3;

–開啟事務A,先計算並更新平均值((術後PTA 氣導左500HZ+術後PTA 氣導左1000HZ+術後PTA 氣導左2000HZ+術後PTA 氣導左4000HZ)/4=術後PTA 平均左)———–

BEGIN TRAN TL01 ;
DECLARE @ERRORA INT
SET @ERRORA = 0;
DECLARE @TEMPAVG INT
DECLARE @bCRFData_Id INT
DECLARE @bCRF_Variable_Id INT
DECLARE @J INT
SET @J=1
DECLARE @COUNTA INT
SELECT @COUNTA = COUNT(1)
FROM #TEMPBL;
WHILE(@COUNTA>[email protected])
BEGIN
SELECT @TEMPAVG = TEMPAVG
FROM #TEMPBL
WHERE Id = @J;
SELECT @bCRFData_Id = bCRFData_Id
FROM #TEMPBL
WHERE Id = @J;
SELECT @bCRF_Variable_Id = bCRF_Variable_Id
FROM #TEMPBL
WHERE Id = @J;
UPDATE dbo.CRFDataValue SET [email protected] WHERE [email protected]_Id AND [email protected]_Variable_Id
SET @[email protected]+1
SET @ERRORA= @ERRORA + @@ERROR;
END
IF @ERRORA = 0
BEGIN
COMMIT TRAN TL01; –提交事務
END;
ELSE
BEGIN
ROLLBACK TRAN TL01; –回滾事務
END;

–根據平均值求分級
WITH SDSRIGHT
AS ( SELECT _CRF_Variable.Name ,
_CRFDataValue.CRF_Variable_Id ,
_CRFDataValue.ContentValue ,
_CRFDataValue.CRFData_Id ,
SUBSTRING(_CRF_Variable.Name, 0, 8) AS TempName
FROM dbo.CRFDataValue AS _CRFDataValue
INNER JOIN dbo.CRF_Variable AS _CRF_Variable ON _CRF_Variable.Id = _CRFDataValue.CRF_Variable_Id
WHERE _CRF_Variable.CRFForm_Id = 1287
AND Name LIKE ‘

SQL SERVER 儲存過程自定義函式

一、功能描述。 需要把 participants 轉換成中文顯示,相關資訊的表如下: 二、自定義函式,作用是解釋用 ;分割的參與者編號,如下: USE [schedule] GO /****** Object:  UserDefinedFunction [dbo].

sql server儲存過程的條件判斷事務管理

CREATEprocedure vipProcess asbegin    if (MONTH(getdate())=7)    begin        begintransaction        update vipPoint set currentStatus=1where baseStatus=1

SQL SERVER儲存過程加密安全上下文

對SQL Server 2008的安全入門略作小結,以作備忘。本文涉及兩個應用:儲存過程加密和安全上下文。 <一>儲存過程加密 SQL server,我已經成了儲存過程的忠實擁躉。在直接使用SQL語句還是儲存過程來處理業務邏輯時,我基本會毫不猶豫地選擇後者。 理由如下:

關於SQL SERVER 儲存過程使用2

  現在有一場景,需要調用出公司員工在本週的請假天數。程式碼如下(1),本人一開始寫的時候用遍歷裡面套著一個遍歷,發現效果出不來如下(2),求是否有什麼方法可以實現遍歷裡面還有個遍歷。 SQL程式碼(1): --建立儲存過程 create procedure LeaveT

SQL Server 儲存過程insert(自增valuesort)

--select * from tblDJCodeNamealter proc demo_codename_insert@codetype varchar(20),@name varchar(20),@value int outputas declare @max int,

(收藏)SQL SERVER 儲存過程加密解密

create PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解位元組不受限制,適用於SQLSERVER

SQL Server儲存過程,傳送陣列引數引數的變通辦法

        最近在做開發過程中碰到這麼一個糾結的問題,需要同時插入N條資料,不想在程式裡控制,但是SQL Sever又不支援陣列引數.所以只能用變通的辦法了.利用SQL Server強大的字串處理傳把陣列格式化為類似"3500320083208#350060052089

C#與SQL Server儲存過程之一建立:使用C#建立SQL Server儲存過程

  通常,開發人員使用的是T-SQL來建立SQL Server的儲存過程、函式和觸發器。而現在的SQL Server 2005已經完全支援.NET通用語言執行時(CLR)了。這就意味著,你可以使用.NET的語言,如C#、VB.NET之類的來開發SQL Server的儲存過程、

SQL Server儲存過程模擬HTTP請求POSTGET協議

/****** Object: StoredProcedure [dbo].[sp_http_get] Script Date: 05/23/2020 15:47:09 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREAT

SQL server 儲存過程的編寫

USE [資料庫名稱] GO /****** Object:  StoredProcedure [dbo].[insertbGait]    Script Date: 2018/7/17 15:51:22 ******/ SET ANSI_NULLS ON GO

mysql儲存過程函式

  儲存過程和函式是事先經過編譯並存儲在資料庫的一段sql語句集合,呼叫儲存過程和函式可以簡化應用程式開發人員的很多工作,減少資料在資料庫和應用伺服器之間的傳輸,對提高資料執行效率是有好處的。   儲存過程和函式的區別在於函式必須有返回值,而儲存過程卻沒有,儲存過程的引數可以使用IN,OUT,INOUT型別

SQL Server 儲存過程返回的幾種方式

獲得儲存過程的返回值–通過查詢分析器獲得 (1)不帶任何引數的儲存過程(儲存過程語句中含有return) —建立儲存過程 CREATE PROCEDURE testReturn AS return 145 GO —執行儲存過程 DECLARE @RC int exec @RC=

Yii2.0呼叫sql server儲存過程獲取返回

1、首先展示建立sql server儲存過程的語句,建立一個簡單的儲存過程,測試用。 1 SET ANSI_NULLS ON 2 GO 3 SET QUOTED_IDENTIFIER ON 4 GO 5 6 CREATE PROCEDURE [dbo].[register_info]

SQL Server儲存過程的使用

   儲存過程概述   簡單來說,儲存過程就是一條或者多條sql語句的集合,可視為批處理檔案,但是其作用不僅限於批處理。  基本概念:   SQL Server中的儲存過程是使用T_SQL編寫的程式碼段。它的目的在於能夠方便的從系統表中查詢資訊,   或者完成與更新資料

SQL Server 儲存過程返回彙總

獲得儲存過程的返回值–通過查詢分析器獲得 (1)不帶任何引數的儲存過程(儲存過程語句中含有return) —建立儲存過程 CREATE PROCEDURE testReturn AS return 145 GO —執行儲存過程 DECLARE @RC in

Sql Server 儲存過程 - 使用者操作例項

使用者的增刪改查 新增 --新增使用者 create procedure addDeviceUser @name nvarchar(36) , @phone nvarchar(36) , @password nvarchar(255) as begin if exists(

Sql server 儲存過程

-- ======================================= -- Author: <zengyongbin> -- Create date: <2018-11-11> -- Description: <新增> --

SQL Server儲存過程中top後為變數時的處理

@pageRecordNum為每頁顯示的記錄數,@currentPageNum為當前的頁數 create proc pagination  @pageRecordNum int,@currentPageNum int as  declare @recNum varchar(