SqlServer儲存過程
阿新 • • 發佈:2021-06-30
1、sqlserver使用儲存過程利用遊標進行迴圈處理統計資訊
DECLARE DataBaseNames CURSOR FOR (select dataname from #min_Tmp)
2、儲存過程儲存在[master]下
3、通過 SysObjects 獲取指定資料庫(master)下的指定表名(Test_01)
SELECT Name FROM master..SysObjects Where XType='U' and name like 'Test%';
4、通過exec(sqlStr)執行動態拼接的sql語句
USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[Statistics_min] AS BEGIN DECLARE @NowDate nvarchar(100); DECLARE @DataBaseName nvarchar(100); DECLARE @DataTableName nvarchar(100); DECLARE @DBNameTemp nvarchar(100); DECLARE @DTNameMaxTemp nvarchar(100); DECLARE @DTNameMinTemp nvarchar(100); DECLARE @DTNameAvgTemp nvarchar(100); DECLARE @DTNameVarTemp nvarchar(100); DECLARE @dataTime nvarchar(100); DECLARE @max_col1 nvarchar(100); DECLARE @min_col1 nvarchar(100); DECLARE @avg_col1 nvarchar(100); DECLARE @var_col1 nvarchar(100); DECLARE @max_col2 nvarchar(100); DECLARE @min_col2 nvarchar(100); DECLARE @avg_col2 nvarchar(100); DECLARE @var_col2 nvarchar(100); declare @sql nvarchar(2000); --start 查詢所有資料庫名 --建立臨時表 create table #min_Tmp(dataname varchar(100)); insert into #min_Tmp([dataname])values('資料庫_1'); insert into #min_Tmp([dataname])values('資料庫_2'); insert into #min_Tmp([dataname])values('資料庫_3'); --獲取當前時間並將 2021-06-30 14:53:52 轉換為 2021-06-30-14-53格式 set @NowDate= (select CONCAT(year(dateadd(MINUTE,-2,getdate())),'-',right('00'+convert(nvarchar(50),month(dateadd(MINUTE,-2,getdate()))),2),'-',right('00'+convert(nvarchar(50),day(dateadd(MINUTE,-2,getdate()))),2),'-',right('00'+convert(nvarchar(50),datename(hh,dateadd(MINUTE,-2,getdate()))),2),'-',right('00'+convert(nvarchar(50),datename(mi,dateadd(MINUTE,-2,getdate()))),2))); --設定DataBaseNames遊標 DECLARE DataBaseNames CURSOR FOR (select dataname from #min_Tmp) OPEN DataBaseNames --開啟DataBaseNames遊標 FETCH NEXT FROM DataBaseNames INTO @DataBaseName --獲取第一個值並賦值給@DataBaseName WHILE @@fetch_status = 0 BEGIN --start 查詢包含Test的所有表名並設定遊標 exec('DECLARE DataTableNames CURSOR FOR( SELECT Name FROM ['+@DataBaseName+']..SysObjects Where XType=''U'' and name like ''Test%'')') OPEN DataTableNames --開啟DataTableNames遊標 FETCH NEXT FROM DataTableNames INTO @DataTableName --獲取第一個值並賦值給@DataTableName WHILE @@fetch_status = 0 BEGIN --start 統計指定資料庫下的指定表名的資料資訊 設定DataNames遊標 exec('DECLARE DataNames CURSOR FOR(select (left(col0,16) +''-00.000'') as ''dataTime'', max(col1) as ''max_col1'',min(col1) as ''min_col1'',avg(col1) as ''avg_col1'',var(col1) as ''var_col1'', max(col2) as ''max_col2'',min(col2) as ''min_col2'',avg(col2) as ''avg_col2'',var(col2) as ''var_col2'' from [' +@DataBaseName +'].[dbo].['+@DataTableName+'] where left(col0,16)='''+ @NowDate+ ''' group by left(col0,16) )' ) OPEN DataNames --開啟DataNames遊標 FETCH NEXT FROM DataNames INTO @dataTime,@max_col1,@min_col1,@avg_col1,@var_col1,@max_col2,@min_col2,@avg_col2,@var_col2 WHILE @@fetch_status = 0 BEGIN --start 處理 要插入資料的表 set @DBNameTemp=replace(@DataBaseName,'_c','_anays') set @DTNameMaxTemp=concat(@DataTableName,'_min','_max') set @DTNameMinTemp=concat(@DataTableName,'_min','_min') set @DTNameAvgTemp=concat(@DataTableName,'_min','_avg') set @DTNameVarTemp=concat(@DataTableName,'_min','_var') ----最大值 set @sql='delete from ['+@DBNameTemp+'].[dbo].['+@DTNameMaxTemp+'] where col0='''+@dataTime+''';'; set @sql +='insert into ['+@DBNameTemp+'].[dbo].['+@DTNameMaxTemp+']([col0],[col1],[col2])' set @sql +='values('''+@dataTime+''','+@max_col1+','+@max_col2+');' ----最小值 set @sql +='delete from ['+@DBNameTemp+'].[dbo].['+@DTNameMinTemp+'] where col0='''+@dataTime+''';'; set @sql +='insert into ['+@DBNameTemp+'].[dbo].['+@DTNameMinTemp+']([col0],[col1],[col2])' set @sql +='values('''+@dataTime+''','+@min_col1+','+@min_col2+');' ----平均值 set @sql +='delete from ['+@DBNameTemp+'].[dbo].['+@DTNameAvgTemp+'] where col0='''+@dataTime+''';'; set @sql +='insert into ['+@DBNameTemp+'].[dbo].['+@DTNameAvgTemp+']([col0],[col1],[col2])' set @sql +='values('''+@dataTime+''','+@avg_col1+','+@avg_col2+');' ----方差 set @sql +='delete from ['+@DBNameTemp+'].[dbo].['+@DTNameVarTemp+'] where col0='''+@dataTime+''';'; set @sql +='insert into ['+@DBNameTemp+'].[dbo].['+@DTNameVarTemp+']([col0],[col1],[col2])' set @sql +='values('''+@dataTime+''','+@var_col1+','+@var_col2+');' exec(@sql); --end 處理 FETCH NEXT FROM DataNames INTO @dataTime,@max_col1,@min_col1,@avg_col1,@var_col1,@max_col2,@min_col2,@avg_col2,@var_col2 END CLOSE DataNames --結束 關閉DataNames遊標 DEALLOCATE DataNames --釋放DataNames遊標 --end 統計 FETCH NEXT FROM DataTableNames INTO @DataTableName --將下一個值賦值給@DataTableName END CLOSE DataTableNames --結束 關閉DataTableNames遊標 DEALLOCATE DataTableNames ---釋放DataTableNames遊標 --end 查詢所有表名 FETCH NEXT FROM DataBaseNames INTO @DataBaseName --將下一個值賦值給@DataBaseName END CLOSE DataBaseNames --結束 關閉DataBaseNames遊標 DEALLOCATE DataBaseNames --釋放DataBaseNames遊標 --end 查詢所有資料庫名 END drop table #min_Tmp --刪除臨時表#Tmp