-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRunSQL.ps1
More file actions
158 lines (138 loc) · 5.44 KB
/
RunSQL.ps1
File metadata and controls
158 lines (138 loc) · 5.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#requires -Modules GAC,SqlServer
<#
.EXAMPLE
"SQL Server"
#[Microsoft.SqlServer.Management.Smo.Database]$db
$db = sqldbs.ps1 | Select -first 1
$db = ls SQLSERVER:\SQL\SOS-SQL1\#2012\Databases\ | ? Name -like A* | select -first 1
RunSQL.ps1 $db.Name -Queries 'select * from sys.sql_logins' -SQLServer $db.Parent.Name
RunSQL.ps1 $db.Name -SQLServer $db.Parent.Name -StoredProcedures 'sp_help' -Parameters @{objname="sp_configure"}
.EXAMPLE
"Oracle"
RunSQL.ps1 SLATE -Queries 'select * from global_name'
#>
[cmdletbinding()]
param(
# The Database Name
[parameter(mandatory=$true)] [string]$Database,
# execute contents of SQL files
[string[]]$SQLFiles,
# SQL Queries
[string[]]$Queries,
# SQL Server instance (leave blank for Oracle DBs)
[string]$SQLServer,
# Stored Procedures
[string]$StoredProcedures,
# Parameters to pass to the SPs
$Parameters=@{}
)
#$ErrorActionPreference = "Stop"
#Soft Requirement to keep Format-Table from breaking pipeline
Import-Module FormatPx -ErrorAction SilentlyContinue -Verbose:$false
if (-not $Queries -and -not $SQLFiles -and -not $StoredProcedures) {
Write-Error "No SQL specified"
exit 1
}
function getConnection() {
if ($SQLServer) {
Write-Verbose "SQL Server"
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$oConn = New-Object -TypeName System.Data.SqlClient.SqlConnection
$oConn.ConnectionString = "SERVER=$SQLServer;Integrated Security = True;Initial Catalog=$Database"
#Attach the InfoMessage Event Handler to the connection to write out the messages
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Warning $event.Message };
$oConn.add_InfoMessage($handler);
$oConn.FireInfoMessageEventOnUserErrors = $true;
$oConn.Open()
if ($oConn.State -eq 'Closed') {exit}
return $oConn
} else {
Write-Verbose "Oracle"
$assembly=Get-GacAssembly Oracle.DataAccess -Version 4.* -ProcessorArchitecture $env:PROCESSOR_ARCHITECTURE | sort Version | select -Last 1
if ($assembly) {
#$assembly
Add-Type -AssemblyName ($assembly.FullName)
} else {
Write-Error "Unable to find Oracle.DataAccess driver"
exit
}
$connString= "User Id=/;Data Source=$Database;"
$oConn = New-Object Oracle.DataAccess.Client.OracleConnection($connString)
if ($SQLServer) {
#Attach the InfoMessage Event Handler to the connection to write out the messages
$handler = [System.Data.SqlClient.SqlInfoMessageEventHandler] {param($sender, $event) Write-Warning $event.Message };
$oConn.add_InfoMessage($handler);
$oConn.FireInfoMessageEventOnUserErrors = $true;
}
$oConn.Open()
if ($oConn.State -eq 'Closed') {exit}
return $oConn
}
}
function getCommand() {
param([Object]$oConn)
if ($oConn.GetType().FullName -eq 'System.Data.SqlClient.SqlConnection') {
$Cmd = New-Object -TypeName system.data.sqlclient.sqlcommand
$Cmd.Connection = $oConn
#$Cmd.CommandText = $query
return $Cmd
} elseif ($oConn.GetType().FullName -eq 'Oracle.DataAccess.Client.OracleConnection') {
$Cmd = new-Object Oracle.DataAccess.Client.OracleCommand
$Cmd.Connection = $oConn
return $Cmd
} else {
Write-Error "Unknown connection type passed"
}
}
function RunSQL() {
param(
[Object]$oConn,
[ValidateSet('StoredProcedure')][String]$CommandType
)
Using-Object.ps1 ($Cmd = getCommand $oConn) {
if (-not $Cmd) {Write-Error "Unable to getCommand";exit 1}
$Cmd.CommandText = $sql
foreach($p in $Parameters.Keys){
[Void] $Cmd.Parameters.AddWithValue("@$p",$Parameters[$p])
}
$Cmd.CommandTimeout = (60*60) # In Seconds
if ($CommandType) {$Cmd.CommandType = [System.Data.CommandType]$CommandType}
if ($CommandType -eq 'StoredProcedurexxx') {
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter($Cmd)
$DataSet = New-Object System.Data.DataSet
[Void] $SqlAdapter.Fill($DataSet)
return $DataSet.Tables[0]
} else {
Using-Object.ps1 ($reader = $Cmd.ExecuteReader()) {
while ($reader.Read()) {
$data=[PSCustomObject]@{}
for($i = 0; $i -lt $reader.FieldCount; $i++) {
$data | Add-Member -MemberType NoteProperty -Name $reader.GetName($i) -Value $reader.Item($i)
}
$data
}
}
}
}
}
Using-Object.ps1 ($oConn = getConnection) {
if ($Queries) {
foreach ($sql in $Queries) {
Write-Verbose "Query: $sql"
RunSQL $oConn | Format-Table -AutoSize
}
}
if ($SQLFiles) {
foreach ($file in $SQLFiles) {
Write-Verbose "File: $file"
$sql = Get-Content $file
RunSQL $oConn | Format-Table -AutoSize
}
}
if ($StoredProcedures) {
foreach ($sql in $StoredProcedures) {
Write-Verbose "SP: $sql"
RunSQL $oConn -CommandType StoredProcedure | Format-Table -AutoSize
}
}
}