本節書摘來自異步社區出版社《PowerShell V3—SQL Server 2012數據庫自動化運維權威指南》一書中的第2章,第2.13節,作者:【加拿大】Donabel Santos,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
2.13 創建視圖
本方案展示了如何用PowerShell和SMO創建視圖。
2.13.1 準備
我們將會使用AdventureWorks2008R2數據庫的Person.Person表。
為了知道我們將會創建什么,我們給出了等價的T-SQL。
CREATE VIEW dbo.vwVCPerson
AS
SELECT TOP 100BusinessEntityID,LastName,FirstName
FROM Person.Person
WHERE PersonType = 'IN'
ORDER BYLastName
GO
2.13.2 如何做…
1.通過“Start | Accessories | Windows PowerShell | Windows PowerShell ISE”打開PowerShell控制臺。
2.導入SQLPS模塊,創建一個新的SMO服務器對象。
#import SQL Server module
Import-Module SQLPS –DisableNameChecking
#replace this with your instance name
$instanceName = "KERRIGAN"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server
-ArgumentList $instanceName
3.添加下面的腳本并運行。
$dbName = "AdventureWorks2008R2"
$db = $server.Databases[$dbName]
$viewName = "vwVCPerson"
$view = $db.Views[$viewName]
#if view exists, drop it
if ($view)
{$view.Drop()
}
$view = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View –ArgumentList
$db, $viewName, "dbo"
#TextMode = false meaning we are not
#going to explicitly write the CREATE VIEW header
$view.TextMode = $false
$view.TextBody = @"
SELECT TOP 100BusinessEntityID,LastName,FirstName
FROM Person.Person
WHERE PersonType = 'IN'
ORDER BYLastName
"@
$view.Create()
4.通過在PowerShell中運行下面的代碼測試視圖。
$result = Invoke-Sqlcmd `
-Query "SELECT * FROM vwVCPerson" `
-ServerInstance "$instanceName" `
-Database $dbName
$result | Format-Table –AutoSize
5.檢查是否已創建視圖。打開SSMS,展開AdventureWorks2008R2數據庫的Views。
2.13.3 如何實現…
為了使用SMO和PowerShell創建視圖,你首先需要創建一個SMO View變量,它需要3個參數:database handle、view name和schema。
$view = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View
-ArgumentList $db, $viewName, "dbo"
可選的設置視圖的所有者。
$view.Owner = "QUERYWORKS\aterra"
視圖創建的核心是視圖的定義。我們將TextMode屬性設置為true或false。
$view.TextMode = $false
$view.TextBody = @"
SELECT TOP 100BusinessEntityID,LastName,FirstName
FROM Person.Person
WHERE PersonType = 'IN'
ORDER BYLastName
"@
如果將TextMode屬性設置為false,意味著讓SMO構造視圖頭部。
$view.TextMode = $false
如果將TextMode屬性設置為true,意味著你需要定義視圖的TextHeader屬性。
$view.TextMode = $true
$view.TextHeader = "CREATE VIEW dbo.vwVCPerson AS "
當都準備好后,調用視圖的Create方法。
$view.Create()
2.13.4 更多…
當創建數據庫對象如視圖、存儲過程或者函數,你需要為對象的定義寫代碼。盡管技術上允許你將代碼放在一行,但是將它們放在多行格式更具可讀性。
為了嵌入代碼塊到PowerShell,你需要創建一個字符串。該字符串以@”開始并什么都不跟,并且以”@結束,且必須是該行開頭的前兩個字符。
$view.TextBody = @"
SELECT TOP 100BusinessEntityID,LastName,FirstName
FROM Person.Person
WHERE PersonType = 'IN'
ORDER BYLastName
"@
這個構造可能讓你會向導C類型注釋,以/開頭以/結束,只是使用不同的字符。