使用SQLCMD在SQLServer执行多个脚本
概述: 作为 DBA ,经常要用开发人员提供的 SQL 脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给 DBA 执行的时候,可能已经有几百个 sql 文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构、存储过程
概述:
作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构、存储过程、视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么就要按顺序执行过千次,这种工作量可不是一个人能承受得了的。
解决方法:
应对这种情况有以下几种方法:
1、 购买第三方软件(一般估计很少人买)
2、 自己编程一个小软件来执行,但是这个逻辑性要求比较高,而且编程的能力要有一定层次,这个我暂时没有。
3、 使用本文介绍的方法,至于是啥,接着看:
使用SQLCMD在SQLServer上执行多个脚本:
SQLCMD:使用 sqlcmd 实用工具,可以在命令提示符处、在 SQLCMD 模式下的“查询编辑器”中、在 Windows 脚本文件中或者在 SQL Server 代理作业的操作系统 (Cmd.exe) 作业步骤中输入 Transact-SQL 语句、系统过程和脚本文件。 此实用工具使用 ODBC 执行 Transact-SQL 批处理。(来源于MSDN)详细语法可以到网上查找,这里就不贴出来。
SQLCMD有一个很重要的命令::r,记住,SQLCMD是大小写敏感的。当:r发现正在运行SQL脚本,它会告诉SQLCMD把这个文件所引用的文件一并放入调用脚本中。这将告诉你,停止目前的单个查询。并重新调整查询,把应该关联的查询放到适当的位置。另外,使用:r命令在一个批处理中执行多个脚本,使得你可以定义一个单独的变量集,用于包含所有脚本,但是不包含GO终结符。从2005以后引入SQLCMD,可以用于将来替代osql工具。如果你不熟悉SQLCMD,可以认为它是一个能从操作系统执行T-SQL命令和脚本的命令行工具。
下面例子中,创建5个作用在TestDB数据库上有关联的sql文件。第一个脚本叫做CREATE_DB.sql,用于创建一个叫做TestDB的数据库。这个脚本包含了4个其他的脚本(使用了:r命令。),用于生成其他表、表插入、索引创建和存储过程的创建。一个.bat文件用于创建用来执行SQLCMD命令。
第一步:先创建一个在C盘下的文件夹:C:\Scripts。然后把脚本存放到这个文件夹中:
脚本1:CREATE_DB.sql
/* SCRIPT: CREATE_DB.sql */ /* 创建TestDB数据库 */ -- This is the main caller for each script SET NOCOUNT ON GO PRINT '开始创建TestDB数据库' IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = 'TestDB') DROP DATABASE TestDB GO CREATE DATABASE TestDB GO :On Error exit :r c:\Scripts\CREATE_TABLES.sql :r c:\Scripts\TABLE_INSERTS.sql :r c:\Scripts\CREATE_INDEXES.sql :r c:\Scripts\CREATE_PROCEDURES.sql PRINT '创建完毕' GO
脚本2:CREATE_INDEXES.sql
/* 创建索引 */ PRINT '开始创建索引' GO USE TestDB GO IF NOT EXISTS ( SELECT 1 FROM SYS.INDEXES WHERE NAME = 'IX_EMPLOYEE_LASTNAME' ) CREATE INDEX IX_EMPLOYEE_LASTNAME ON DBO.EMPLOYEE(LASTNAME, FIRSTNAME) GO IF NOT EXISTS ( SELECT 1 FROM SYS.INDEXES WHERE NAME = 'IX_TIMECARD_EMPLOYEEID' ) CREATE INDEX IX_TIMECARD_EMPLOYEEID ON DBO.TIMECARD(EMPLOYEEID) GO
脚本3:CREATE_PROCEDURES.sql
/* 创建存储过程 */ PRINT '正在创建存储过程' GO USE TestDB GO IF OBJECT_ID('GET_EMPLOYEE_TIMECARDS') IS NOT NULL DROP PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS GO CREATE PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS @EMPLOYEEID INT AS SET NOCOUNT ON SELECT * FROM DBO.EMPLOYEE E JOIN DBO.TIMECARD T ON E.EMPLOYEEID = T.EMPLOYEEID WHERE E.EMPLOYEEID = @EMPLOYEEID ORDER BY DATEWORKED GO
脚本4:CREATE_TABLES.sql
/* 创建数据表 */ PRINT '正在创建数据表 ' GO USE TestDB GO IF OBJECT_ID('EMPLOYEE') IS NOT NULL DROP TABLE DBO.EMPLOYEE GO CREATE TABLE DBO.EMPLOYEE ( EMPLOYEEID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY , FIRSTNAME VARCHAR(50) , LASTNAME VARCHAR(50) ) GO IF OBJECT_ID('TIMECARD') IS NOT NULL DROP TABLE DBO.TIMECARD GO CREATE TABLE DBO.TIMECARD ( TIMECARDID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY , EMPLOYEEID INT NOT NULL , HOURSWORKED TINYINT NOT NULL , HOURLYRATE MONEY NOT NULL , DATEWORKED DATETIME NOT NULL ) GO DECLARE @TOTAL_TABLES INT SET @TOTAL_TABLES = 2
脚本5:TABLE_INSERTS.sql
/* 插入表数据 */ PRINT 'TOTAL TABLES CREATED = ' + CAST(@TOTAL_TABLES AS VARCHAR) GO PRINT '正在插入数据到表 EMPLOYEE' GO USE TestDB GO INSERT INTO DBO.EMPLOYEE ( FIRSTNAME, LASTNAME ) SELECT 'JOHN' , 'DOE' GO INSERT INTO DBO.EMPLOYEE ( FIRSTNAME, LASTNAME ) SELECT 'JANE' , 'DOE' GO INSERT INTO DBO.EMPLOYEE ( FIRSTNAME, LASTNAME ) SELECT 'JEFF' , 'DOE' GO
第二步:在C盘根目录下创建一个bat文件create_db.bat,用于执行SQLCMD:
SQLCMD -E -dmaster -ic:\Scripts\create_db.sql PAUSE
第三步:在C盘下直接执行bat文件:
双击文件可以看到:
在执行前,是没有TestDB:
执行中:
执行后,该创建的东西都创建出来了:
由于执行的顺序已经在脚本1中定义好,所以直接执行即可,并且执行成功。
总结:
根据个人经验,还是开发一个批量执行工具会比较好,这个方法在少量脚本的时候可以选用。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

匯入步驟如下:將 MDF 檔案複製到 SQL Server 的資料目錄(通常為 C:\Program Files\Microsoft SQL Server\MSSQL\DATA)。在 SQL Server Management Studio(SSMS)中,開啟資料庫並選擇「附加」。點選“新增”按鈕,選擇 MDF 檔案。確認資料庫名稱,點選確定按鈕即可。

對於 SQL Server 資料庫中已存在同名對象,需要採取下列步驟:確認物件類型(表格、檢視、預存程序)。如果物件為空,可使用 IF NOT EXISTS 跳過建立。如果物件有數據,使用不同名稱或修改結構。使用 DROP 刪除現有物件(謹慎操作,建議備份)。檢查架構更改,確保沒有引用刪除或重新命名的物件。

若要查看 SQL Server 連接埠號碼:開啟 SSMS,連線到伺服器。在物件資源管理器中找到伺服器名稱,右鍵單擊它,然後選擇“屬性”。在「連線」標籤中,查看「TCP 連接埠」欄位。

若誤刪 SQL Server 資料庫,可採取下列步驟還原:停止資料庫活動;備份日誌檔案;檢查資料庫日誌;復原選項:從備份還原;從交易日誌還原;使用 DBCC CHECKDB;使用第三方工具。請定期備份資料庫並啟用交易日誌以防止資料遺失。

SQL Server 資料庫檔案通常儲存在下列預設位置:Windows: C:\Program Files\Microsoft SQL Server\MSSQL\DATALinux: /var/opt/mssql/data可透過修改資料庫檔案路徑設定來自訂資料庫檔案位置。

當 SQL Server 服務無法啟動時,可採取下列步驟解決:檢查錯誤日誌以確定根本原因。確保服務帳戶具有啟動服務的權限。檢查依賴項服務是否正在執行。禁用防毒軟體。修復 SQL Server 安裝。如果修復不起作用,重新安裝 SQL Server。

MetaMask(中文也叫小狐狸錢包)是一款免費的、廣受好評的加密錢包軟體。目前,BTCC已支援綁定MetaMask錢包,綁定後可使用MetaMask錢包進行快速登錄,儲值、買幣等,且首次綁定還可獲得20USDT體驗金。在BTCCMetaMask錢包教學中,我們將詳細介紹如何註冊和使用MetaMask,以及如何在BTCC綁定並使用小狐狸錢包。 MetaMask錢包是什麼? MetaMask小狐狸錢包擁有超過3,000萬用戶,是當今最受歡迎的加密貨幣錢包之一。它可免費使用,可作為擴充功能安裝在網絡

網易郵箱,作為中國網友廣泛使用的一種電子郵箱,一直以來以其穩定、高效的服務贏得了用戶的信賴。而網易信箱大師,則是專為手機使用者打造的信箱軟體,它大大簡化了郵件的收發流程,讓我們的郵件處理變得更加便利。那麼網易信箱大師該如何使用,具體又有哪些功能呢,下文中本站小編將為大家帶來詳細的內容介紹,希望能幫助到大家!首先,您可以在手機應用程式商店搜尋並下載網易信箱大師應用程式。在應用寶或百度手機助手中搜尋“網易郵箱大師”,然後按照提示進行安裝即可。下載安裝完成後,我們打開網易郵箱帳號並進行登錄,登入介面如下圖所示
