1. 程式人生 > >遍歷資料夾還原資料庫SQL語句

遍歷資料夾還原資料庫SQL語句


/***** 
遍歷資料夾進行資料庫還原
*******/



---需要開啟xp_cmdshell 如已經開啟 可以略過
/***** Step 1 開啟 xp_cmdshell 
Use Master
GO
EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO
*******/


IF OBJECT_ID('tempdb..#files') IS NULL
BEGIN
    --DROP TABLE  #files
    CREATE TABLE #files
    (
    	dbname     VARCHAR(200) NULL,
    	dbsql      VARCHAR(7000) NULL
    )
END

DELETE #files 

IF OBJECT_ID('tempdb..#filelistinfo') IS NOT NULL
    DROP TABLE #filelistinfo

CREATE TABLE #filelistinfo
(
	LogicalName              NVARCHAR(128) NULL,
	PhysicalName             NVARCHAR(260) NULL,
	TYPE                     CHAR(1) NULL,
	FileGroupName            NVARCHAR(128) NULL,
	FileSize                 BIGINT NULL,
	MAXSIZE                  BIGINT NULL,
	FileId                   BIGINT,
	CreateLSN                NUMERIC(25, 0),
	DropLSN                  NUMERIC(25, 0) NULL,
	UniqueID                 UNIQUEIDENTIFIER,
	ReadOnlyLSN              NUMERIC(25, 0) NULL,
	ReadWriteLSN             NUMERIC(25, 0) NULL,
	BackupSizeInBytes        BIGINT,
	SourceBlockSize          INT,
	FileGroupID              INT,
	LogGroupGUID             UNIQUEIDENTIFIER NULL,
	DifferentialBaseLSN      NUMERIC(25, 0) NULL,
	DifferentialBaseGUID     UNIQUEIDENTIFIER,
	IsReadOnly               BIT,
	IsPresent                BIT,
	TDEThumbprint            BIT
)





DECLARE @path VARCHAR(500)
DECLARE @pathData VARCHAR(500)
DECLARE @sql VARCHAR(8000)
DECLARE @bakName VARCHAR(500)
DECLARE @LogicalNameDat VARCHAR(500)
DECLARE @LogicalNameLog VARCHAR(500)
DECLARE @tempCommand VARCHAR(800) 

SET @path = 'E:\DataBak'    ---指定要處理的資料夾
SET @sql = 'dir ' + @path + ' /b'
SET @pathData = 'D:\SqlDataBase' ----資料庫還原到的目錄
SET @bakName = ''  -----統一的備份名稱(不要加.bak),比如固定日期或者可變名,根據自己的路徑規則定
  
--獲取檔名稱,存放在#files
INSERT #files
  (
    dbname
  )
EXEC MASTER..xp_cmdshell @sql

  


--從#files表遍歷處理據庫數資訊,根據備份檔案獲取資料邏輯名稱
						 
DECLARE @dbname VARCHAR(50)
DECLARE curs CURSOR 
FOR
    --定義遊標curs
    SELECT dbname
    FROM   #files               
						OPEN curs                       

						FETCH NEXT FROM curs INTO @dbname  

WHILE @@fetch_status = 0 
BEGIN
    SET @bakName = @dbname  --根據自己的路徑規則來定
    
    --根據自己路徑規則拼接資料庫備份檔案路徑,並執行RESTORE FILELISTONLY
    SET @tempCommand = 'restore filelistonly from disk=''' + @path + '\' +
        @dbname + '\' + @bakName + '.bak'''
    
    PRINT @tempCommand
    
    --將得到資料庫的資料存入臨時表#filelistinfo
    INSERT INTO #filelistinfo
    EXEC (@tempCommand)
    
    SELECT @LogicalNameDat = LogicalName
    FROM   #filelistinfo
    WHERE [TYPE]= 'D'  --資料庫檔案
    
    SELECT @LogicalNameLog = LogicalName
    FROM   #filelistinfo
    WHERE [TYPE]= 'L' --日誌檔案
    
    
    --拼接恢復資料庫語句,並更新對應記錄到#files
    UPDATE #files
    SET    dbsql = 'RESTORE DATABASE ' + dbname 
           + ' FROM DISK = ''' + @path + '\' + dbname + '\' + @bakName +
           '.bak''' 
           + ' WITH MOVE ''' + @LogicalNameDat + ''' TO ''' + @pathData + '\' +
           dbname
           + '.mdf'','
           + ' MOVE ''' + @LogicalNameLog + ''' TO ''' + @pathData + '\' +
           dbname +
           '_log.ldf'''
    WHERE  dbname = @dbname
    
    --清除#filelistinfo臨時表,繼續處理下一條記錄
    DELETE FROM   #filelistinfo
    
    FETCH NEXT FROM curs INTO @dbname  
END

					CLOSE curs                   
					DEALLOCATE curs
			 


 	
			
			
SELECT *
FROM   #files


--遍歷#files表 執行恢復
DECLARE cur CURSOR STATIC LOCAL 
FOR
    SELECT dbsql
    FROM   #files

OPEN cur

WHILE 1 = 1
BEGIN
    FETCH cur INTO @sql
    IF @@fetch_status <> 0
        BREAK
    
    EXEC (@sql)
END

DEALLOCATE cur

DROP TABLE  #files

操作原理:

遍歷備份檔案,將所有要還原的資料庫名稱存入#files

通過執行“RESTORE FILELISTONLY”,將結果存入##filelistinfo,從記錄中得到備份資料庫的庫檔案及日誌檔案的邏輯檔名,拼接“RESTORE DATABASE”,並對應更新存入#files表

遍歷#files表,執行恢復語句

本例 備份檔案儲存路徑參考:

相關推薦

資料還原資料庫SQL語句

/***** 遍歷資料夾進行資料庫還原 *******/ ---需要開啟xp_cmdshell 如已經開啟 可以略過 /***** Step 1 開啟 xp_cmdshell Use Master GO EXEC master.dbo.sp_configure '

AHK 資料下ahk檔案並執行與刪除

folder = D:\ver_upload\new Loop, %folder%\*.ahk FileList = %FileList%%A_LoopFileTimeModified%`t%A_LoopFileName%`n Sort, FileList ;根據日期排序.從小到大 Loo

c#資料獲得所有檔案

c#遍歷資料夾獲得所有檔案 在c#中,想要獲得一個資料夾下的所有子目錄以及檔案十分簡單。 首先,獲取目錄的情況下,DirectoryInfo.GetDirectories():獲取目錄(不包含子目錄)的子目錄,返回型別為DirectoryInfo[],支援萬用字元查詢; 其次,獲取檔案的

php資料所有檔案

function listFiles($dir) { $files = array(); $handle = opendir($dir); while ($file = readdir($handle)) { if (

資料內所有的CSV檔案,並且合併為同一個CSV

import pandas as pd import os ### 讀取檔案中的資料內容。 os.listdir(u"F:/公司/03_Study/01_爬蟲") Folder_Path = u"F:/公司/03_Study/01_爬蟲" # 要拼接的資料夾及其完整路徑,注意不要包含中文

Python 資料裡面的內容 5*

root_path='./result' sub_path=root_path+'./tmp' for root, dirs, files in os.walk(sub_path): for file in files: if os.path.splitext(file)[

Linux下資料

#include <dirent.h> #include <stdio.h> #include <stdlib.h> #include <string.h> char *dirname="/path/"; DIR *dirfile; dirfiles

php資料、檔案

php遍歷資料夾、檔案 <?php $path = '/'; foreach_file($path);//傳入需要遍歷的資料夾路徑 function foreach_file($path) { if(is_dir($path))//判斷目錄是否存在 {

【python高階程式設計】一、資料目錄

前言 如何遍歷查找出某個資料夾內所有的子檔案呢?並且找出某個字尾的所有檔案 walk功能簡介 1.os.walk() 方法用於通過在目錄樹種遊走輸出在目錄中的檔名,向上或者向下。 2.walk()方法語法格式如下: os.walk(top,topdown=True,onerr

OpenCV實現資料下所有檔案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【筆記】window下 使用c++資料及其子資料和檔案,並列印檔案路徑及各檔案內容

這兩天一直在學習如何使用c++遍歷資料夾、讀取檔案內容和寫入檔案。 話不多說,直接上程式碼 /** 檔案功能:遞迴遍歷資料夾,遍歷資料夾及其子資料夾和檔案.列印資料夾名稱、檔名稱和檔案數目*** 參考:https://www.cnblogs.com/collectionne/p/679230

SPL資料

$root = 'D:/www/docroot';$iter = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS)

WIN32 C++ 資料

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++資料下所有的wav檔案(支援windows和Linux)

直接上程式碼: #include <iostream> #include <string> #include <vector> #include <fstream> #include <string.h> #includ

一段批處理, 資料裡的csv檔案壓縮, 壓縮包的檔名是原始檔名的擷取

echo off SETLOCAL ENABLEDELAYEDEXPANSION set work_path=F:\somefolder F: cd %work_path% for /R %%s in (*.csv) do ( set fname=%%s echo !fname:~-30,

資料,讀取時間命名的檔案

平常用到的一些資料檔案,經常以時間命名,如“170128.csv”、“170328.csv”等,但是我們想分析一段時間的資料時就需要按照時間選取檔案,這時候按170128的數值直接加減並不合適,因為沒有170150這類的時間,因此需要按時間戳的加減來選擇,時間戳的形式一般為“1/6/17”、“17-

檔案目錄,資料檔案及屬性

目錄檔案:     1、建立目錄:         注:目錄需要執行的許可權,建立資料夾mode& ~umask         &nbs

linux迴圈資料下所有檔案

demofun(){ for file in `ls $1` do if test -f $file then echo "file: $file" elif test -d $file then

[Xcode10 實際操作]七、檔案與資料-(4 )資料中的檔案

本文將演示如何遍歷資料夾下的內容。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2 3 class ViewController: UIViewController { 4 5 override f

遞迴資料下所有檔案

遞迴遍歷資料夾下所有檔案 程式碼塊 遞迴遍歷資料夾下所有檔案 package com.chow; import java.io.File; import java.util.ArrayList; /** * Created by zhouhaiming on 20