SQLServer按次序履行多個劇本的辦法(sqlcmd適用對象應用辦法)。本站提示廣大學習愛好者:(SQLServer按次序履行多個劇本的辦法(sqlcmd適用對象應用辦法))文章只能為提供參考,不一定能成為您想要的結果。以下是SQLServer按次序履行多個劇本的辦法(sqlcmd適用對象應用辦法)正文
處理辦法:
應對這類情形有以下幾種辦法:
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:
雙擊文件可以看到:
在履行前,是沒有TestDB:
履行中:
履行後,該創立的器械都創立出來了:
因為履行的次序曾經在劇本1中界說好,所以直接履行便可,而且履行勝利。
總結:
依據小我經歷,照樣開辟一個批量履行對象會比擬好,這個辦法在大批劇本的時刻可以選用。