1. 程式人生 > 其它 >SqlServer儲存過程

SqlServer儲存過程

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