SQL Server直接该表旧表名称作为备份,并创建新表和查询视图链接多表查询

为了解决大量数据复制造成的数据库超时无法使用的问题,可以采用用另一种方式,将由数据库的表直接修改名称,再创建表,并加入多表联合查询视图解决大数据量转移的问题

CREATE PROCEDURE [dbo].[Pro_BakTable]
AS
BEGIN
--当前表的数量
DECLARE @TABLENAMESCOUNT INT
--新表名称
DECLARE @NEWTABLENAME VARCHAR(500)
--新索引名称
DECLARE @NEWPKNAME VARCHAR(500)
--WHILE循环索引
DECLARE @WHILEINDEX INT
--创建视图的语句
DECLARE @CREATEVIEWSQL VARCHAR(MAX)
--设置创建视图语句初始值
SET @CREATEVIEWSQL='CREATE VIEW fetch_log AS SELECT * FROM Scan_Log '
--设置循环初始值
SET @WHILEINDEX=1
--LOG表的数量
SELECT @TABLENAMESCOUNT=COUNT(*) FROM SYS.TABLES WHERE name like'Scan_Log%'
--LOG表名称保存到临时表A中
SELECT ROW_NUMBER() OVER(ORDER BY NAME) ROWID,* INTO #A FROM SYS.TABLES WHERE name like'Scan_Log%'
--新表名称
SET @NEWTABLENAME='Scan_Log'+CONVERT(varchar,@TABLENAMESCOUNT)
--新主键索引名称
SET @NEWPKNAME='PK_Scan_Log'+CONVERT(varchar,@TABLENAMESCOUNT)

--修改主键索引名称
EXEC sp_rename 'Scan_Log.PK_Scan_Log',@NEWPKNAME
--修改表名
EXEC sp_rename 'Scan_Log',@NEWTABLENAME
--执行创建表存储过程
EXEC create_Scanlog

--组合视图创建语句
WHILE @WHILEINDEX<=@TABLENAMESCOUNT
BEGIN
DECLARE @TTABLENAME NVARCHAR(100)
SELECT @TTABLENAME=NAME FROM #A WHERE ROWID=@WHILEINDEX
--原始表已经添加无需再加入
IF @TTABLENAME<>'Scan_Log'
SET @CREATEVIEWSQL=@CREATEVIEWSQL+' UNION SELECT * FROM '+@TTABLENAME
SET @WHILEINDEX=@WHILEINDEX+1;
END
--判断数据库中是否有fetch_log视图
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'fetch_log')
BEGIN
--如果有删除视图
DROP VIEW fetch_log
END
--执行创建新视图语句
EXEC(@CREATEVIEWSQL)
END

 

posted @ 2019-11-11 10:45  孟二  阅读(95)  评论(0)    收藏  举报