很苦恼,PROD上的SSIS项目,日积月累的往里部署,加包,也没觉得是个什么问题。
但是今天从需要从PROD上把这个项目中所有的包都down下来,VS居然报错Out Of Memory,无论是直接连接SSIS Catelog或者用SSMS导出ispac均报错。
解决方法很简单,使用PowerShell脚本,直接把ispac download下来然后解压缩,这样里面就直接可以看到.dtsx文件了。
核心就在于参数UnzipIspac,一定要是True,这样执行完成后就能直接看见.dtsx包了。
PS脚本:
1 #PowerShell: DownloadIspac.ps1
2 ################################
3 ########## PARAMETERS ##########
4 ################################
5 # Change Server, folder, project and download folder
6 $SsisServer = "XXXXXXXX" # Mandatory
7 $FolderName = "XXXXXXXX" # Can be empty to download multiple projects
8 $ProjectName = "OOOOOOOOO" # Can be empty to download multiple projects
9 $DownloadFolder = "LLLLLLLLLLLLL" # Mandatory
10 $CreateSubfolders = $true # Mandatory
11 $UnzipIspac = $true # Mandatory
12
13
14 #################################################
15 ########## DO NOT EDIT BELOW THIS LINE ##########
16 #################################################
17 clear
18 Write-Host
19
20 "================================================================================================================================
21
22 ========================"
23 Write-Host "== Used parameters =="
24 Write-Host
25
26 "================================================================================================================================
27
28 ========================"
29 Write-Host "SSIS Server :" $SsisServer
30 Write-Host "Folder Name :" $FolderName
31 Write-Host "Project Name :" $ProjectName
32 Write-Host "Local Download Folder :" $DownloadFolder
33 Write-Host "Create Subfolders :" $CreateSubfolders
34 Write-Host "Unzip ISPAC (> .NET4.5) :" $UnzipIspac
35 Write-Host
36
37 "================================================================================================================================
38
39 ========================"
40
41
42 ##########################################
43 ########## Mandatory parameters ##########
44 ##########################################
45 if ($SsisServer -eq "")
46 {
47 Throw [System.Exception] "SsisServer parameter is mandatory"
48 }
49 if ($DownloadFolder -eq "")
50 {
51 Throw [System.Exception] "DownloadFolder parameter is mandatory"
52 }
53 elseif (-not $DownloadFolder.EndsWith(""))
54 {
55 # Make sure the download path ends with an slash
56 # so we can concatenate an subfolder and filename
57 $DownloadFolder = $DownloadFolder = ""
58 }
59
60
61 ############################
62 ########## SERVER ##########
63 ############################
64 # Load the Integration Services Assembly
65 Write-Host "Connecting to server $SsisServer "
66 $SsisNamespace = "Microsoft.SqlServer.Management.IntegrationServices"
67 [System.Reflection.Assembly]::LoadWithPartialName($SsisNamespace) | Out-Null;
68
69 # Create a connection to the server
70 $SqlConnectionstring = "Data Source=" + $SsisServer + ";Initial Catalog=master;Integrated Security=SSPI;"
71 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnectionstring
72
73 # Create the Integration Services object
74 $IntegrationServices = New-Object $SsisNamespace".IntegrationServices" $SqlConnection
75
76 # Check if connection succeeded
77 if (-not $IntegrationServices)
78 {
79 Throw [System.Exception] "Failed to connect to server $SsisServer "
80 }
81 else
82 {
83 Write-Host "Connected to server" $SsisServer
84 }
85
86
87 #############################
88 ########## CATALOG ##########
89 #############################
90 # Create object for SSISDB Catalog
91 $Catalog = $IntegrationServices.Catalogs["SSISDB"]
92
93 # Check if the SSISDB Catalog exists
94 if (-not $Catalog)
95 {
96 # Catalog doesn"t exists. Different name used?
97 Throw [System.Exception] "SSISDB catalog doesn"t exist."
98 }
99 else
100 {
101 Write-Host "Catalog SSISDB found"
102 }
103
104
105 ############################
106 ########## FOLDER ##########
107 ############################
108 if ($FolderName -ne "")
109 {
110 # Create object to the folder
111 $Folder = $Catalog.Folders[$FolderName]
112 # Check if folder exists
113 if (-not $Folder)
114 {
115 # Folder doesn"t exists, so throw error.
116 Write-Host "Folder" $FolderName "not found"
117 Throw [System.Exception] "Aborting, folder not found"
118 }
119 else
120 {
121 Write-Host "Folder" $FolderName "found"
122 }
123 }
124
125
126 #############################
127 ########## Project ##########
128 #############################
129 if ($ProjectName -ne "" -and $FolderName -ne "")
130 {
131 $Project = $Folder.Projects[$ProjectName]
132 # Check if project already exists
133 if (-not $Project)
134 {
135 # Project doesn"t exists, so throw error.
136 Write-Host "Project" $ProjectName "not found"
137 Throw [System.Exception] "Aborting, project not found"
138 }
139 else
140 {
141 Write-Host "Project" $ProjectName "found"
142 }
143 }
144
145
146 ##############################
147 ########## DOWNLOAD ##########
148 ##############################
149 Function DownloadIspac
150 {
151 Param($DownloadFolder, $Project, $CreateSubfolders, $UnzipIspac)
152 if ($CreateSubfolders)
153 {
154 $DownloadFolder = ($DownloadFolder + $Project.Parent.Name)
155 }
156
157 # Create download folder if it doesn"t exist
158 New-Item -ItemType Directory -Path $DownloadFolder -Force > $null
159
160 # Check if new ispac already exists
161 if (Test-Path ($DownloadFolder + $Project.Name + ".ispac"))
162 {
163 Write-Host ("Downloading [" + $Project.Name + ".ispac" + "] to " + $DownloadFolder + " (Warning: replacing existing
164
165 file)")
166 }
167 else
168 {
169 Write-Host ("Downloading [" + $Project.Name + ".ispac" + "] to " + $DownloadFolder)
170 }
171
172 # Download ispac
173 $ISPAC = $Project.GetProjectBytes()
174 [System.IO.File]::WriteAllBytes(($DownloadFolder + "" + $Project.Name + ".ispac"),$ISPAC)
175 if ($UnzipIspac)
176 {
177 # Add reference to compression namespace
178 Add-Type -assembly "system.io.compression.filesystem"
179
180 # Extract ispac file to temporary location (.NET Framework 4.5)
181 Write-Host ("Unzipping [" + $Project.Name + ".ispac" + "]")
182
183 # Delete unzip folder if it already exists
184 if (Test-Path ($DownloadFolder + "" + $Project.Name))
185 {
186 [System.IO.Directory]::Delete(($DownloadFolder + "" + $Project.Name), $true)
187 }
188
189 # Unzip ispac
190 [io.compression.zipfile]::ExtractToDirectory(($DownloadFolder + "" + $Project.Name + ".ispac"), ($DownloadFolder + "" +
191
192 $Project.Name))
193
194 # Delete ispac
195 Write-Host ("Deleting [" + $Project.Name + ".ispac" + "]")
196 [System.IO.File]::Delete(($DownloadFolder + "" + $Project.Name + ".ispac"))
197 }
198 Write-Host ""
199 }
200
201
202 #############################
203 ########## LOOPING ##########
204 #############################
205 # Counter for logging purposes
206 $ProjectCount = 0
207
208 # Finding projects to download
209 if ($FolderName -ne "" -and $ProjectName -ne "")
210 {
211 # We have folder and project
212 $ProjectCount++
213 DownloadIspac $DownloadFolder $Project $CreateSubfolders $UnzipIspac
214 }
215 elseif ($FolderName -ne "" -and $ProjectName -eq "")
216 {
217 # We have folder, but no project => loop projects
218 foreach ($Project in $Folder.Projects)
219 {
220 $ProjectCount++
221 DownloadIspac $DownloadFolder $Project $CreateSubfolders $UnzipIspac
222 }
223 }
224 elseif ($FolderName -eq "" -and $ProjectName -ne "")
225 {
226 # We only have a projectname, so search
227 # in all folders
228 foreach ($Folder in $Catalog.Folders)
229 {
230 foreach ($Project in $Folder.Projects)
231 {
232 if ($Project.Name -eq $ProjectName)
233 {
234 Write-Host "Project" $ProjectName "found in" $Folder.Name
235 $ProjectCount++
236 DownloadIspac $DownloadFolder $Project $CreateSubfolders $UnzipIspac
237 }
238 }
239 }
240 }
241 else
242 {
243 # Download all projects in all folders
244 foreach ($Folder in $Catalog.Folders)
245 {
246 foreach ($Project in $Folder.Projects)
247 {
248 $ProjectCount++
249 DownloadIspac $DownloadFolder $Project $CreateSubfolders $UnzipIspac
250 }
251 }
252 }
253
254 ###########################
255 ########## READY ##########
256 ###########################
257 # Kill connection to SSIS
258 $IntegrationServices = $null
259 Write-Host "Finished, total downloads" $ProjectCount