現在、SSMS から実行したい単純な SQL スクリプトに取り組んでいます。スクリプトが行うことになっているのは、データベースを取得してバックアップを作成し、そのバックアップの .zip ファイルを作成することです。
私が直面している問題は、バックアップを圧縮しようとするときです。ファイルの先頭ですべての変数を宣言しましたが、@sqlcmd を実行しようとすると、文字列が Powershell によって適切に読み取られていないと思います。
SET @sqlcmd = ('powershell.exe [IO.Compression.ZipFile]::CreateFromDirectory("' + @bkpath + '", "C:\'+ @fileName + '.zip")')
PRINT @sqlcmd
-- this statement returns (powershell.exe [IO.Compression.ZipFile]::CreateFromDirectory("C:\Backup\", "C:\ScriptingTestDB_20170607.zip"))
EXEC xp_cmdshell @sqlcmd
このコードを実行すると、結果ウィンドウに次の出力が返されます。
At line:1 char:47
+ [IO.Compression.ZipFile]::CreateFromDirectory(C:\Backup", C:\Scriptin ...
+ ~
Missing ')' in method call.
At line:1 char:56
+ ... le]::CreateFromDirectory(C:\Backup", C:\ScriptingTestDB_20170607.zip)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The string is missing the terminator: ".
At line:1 char:47
+ ... le]::CreateFromDirectory(C:\Backup", C:\ScriptingTestDB_20170607.zip)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'C:\Backup", C:\ScriptingTestDB_20170607.zip)' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
NULL
いくつかのテストの後、Powershell が SQL 文字列を解釈する方法に問題があることがわかりました。多くの引用符があるため、SQL が文字列を正しく出力したとしても、Powershell がそれを取得すると形式が台無しになる可能性があるため、そこで何かを変更する必要がありますが、それでも何がわからないのですか。Powershellが次のように読むように、SQLコードをどのように書くべきかを知るために私が使用できるガイドラインを知っている人はいますか?
[IO.Compression.ZipFile]::CreateFromDirectory("C:\Backup\", "C:\ScriptingTestDB_20170607.zip")