1

我正在尝试使用 Powershell 从 SQL Server 读取视图和存储过程的定义。将定义作为可能的创建并在具有相同名称的数据库上的新服务器中执行它。

有什么想法可以帮助我开始吗?我是 Powershell 的新手。

4

2 回答 2

0

假设对于创建视图,您已经在新服务器中拥有所有引用表

Import-Module SQLPS -DisableNameChecking

$serverName = 'your_source_InstanceName'
$dbname = 'your_source_DbName'
$destServerName = 'your_destination_InstanceName'
$destdbname = 'your_destination_DbName'

$destSrv = New-object "Microsoft.SqlServer.Management.SMO.Server" $destServerName
$destDb = $destSrv.Databases[$destdbname]

$srv = New-object "Microsoft.SqlServer.Management.SMO.Server" $serverName
$db = $srv.Databases[$dbname]

$scr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"
$scr.Server = $srv
$options = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"
$options.AllowSystemObjects = $false
$options.SchemaQualify = $true
$options.ClusteredIndexes = $true
$options.Default = $true
$options.DriAll = $true
$options.Indexes = $true
$options.NonClusteredIndexes = $true

#Set options for SMO.Scripter
$scr.Options = $options

#StoredProcedures
$StoredProcedures = $db.StoredProcedures | where {$_.IsSystemObject -eq $false}
Foreach ($StoredProcedure in $StoredProcedures)
{
    if ($StoredProcedures -ne $null)    
    { 
     Try{
     $destDb.ExecuteWithResults($scr.Script($StoredProcedure))     
     }
     Catch{        
     $err = $Error[0].Exception
     Write-host "Error caught: "  $err.Message; 
     While ($err.InnerException){
     $err = $err.InnerException;
     Write-Host "Inner exception:" $err.InnerException.Message;
     };      
     return;
     }
    }
}

#Views
$views = $db.Views | Where {$_.IsSystemObject -eq $false}
Foreach ($view in $views)
{
    if ($views -ne $null)
    { 
     Try{
     $destDb.ExecuteWithResults($scr.Script($View))     
     }
     Catch{        
     $err = $Error[0].Exception
     Write-host "Error caught: "  $err.Message; 
     While ($err.InnerException){
     $err = $err.InnerException;
     Write-Host "Inner exception:" $err.InnerException.Message;
     };      
     return;
     }
    }
}
于 2013-11-07T12:01:13.243 回答
0

这会让你开始。我不确定您需要做什么,但这将在 PowerShell 中运行一个存储过程。

我使用下面的文章获取此信息。 http://www.databasejournal.com/features/mssql/article.php/3683181/Microsoft-Windows-PowerShell-and-SQL-Server-2005-SMO-150-Part-II.htm

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=HOME\SQLEXPRESS;Database=master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "sp_helpdb"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0]

你可能会做更多这样的事情,我不确定你是否正在使用 PowerShell 社区扩展,但你可以去(仅适用于 2008 年及更高版本):

1.) 添加插件

Add-PSSnapin SqlServerCmdletSnapin100

Add-PSSnapin SqlServerProviderSnapin100

2.)使用Invoke-SQLcmd

$query = "EXEC nameofsproc"
$db = "nameofdatabase"
$instance = "(local)"
$user = 'sa'

invoke-sqlcmd -query $query -database $db -serverinstance $instance -Variable 

下面是一个网站,详细描述了在 Powershell 中创建视图:

http://bi-bigdata.com/2013/03/10/powershell-tutorial-for-creating-view/

于 2013-11-06T17:11:58.510 回答