sql - 如何格式化 SQL 中的字符串,以便在 Powershell 中正确解释它?

标签 sql powershell ssms-2016

我目前正在编写一个简单的 SQL 脚本,我想从 SSMS 运行它。该脚本的作用是获取数据库,对其进行备份,然后将该备份创建为 .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 获取它时,格式可能会变得困惑,因此需要更改一些内容,但仍然不确定是什么。有谁知道我可以用来找出如何编写 SQL 代码以便 Powershell 读取以下内容的任何指南:

[IO.Compression.ZipFile]::CreateFromDirectory("C:\Backup\", "C:\ScriptingTestDB_20170607.zip")

最佳答案

您需要使用 \ 转义 " 字符。我的工作脚本:

declare @sqlcmd varchar(1000), @bkpath nvarchar(max) = 'C:\i1\tmp', @filename nvarchar(max) = 'file'

SET @sqlcmd = 'powershell.exe Add-Type -AssemblyName System.IO.Compression.FileSystem; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"' + @bkpath + '\", \"C:\i1\'+ @fileName + '.zip\")'
EXEC xp_cmdshell @sqlcmd   

关于sql - 如何格式化 SQL 中的字符串,以便在 Powershell 中正确解释它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44422651/

相关文章:

sql - 在几个静态股票值(value)的时期内获得平均股票的最快方法

mysql - 对数字范围 mysql 执行计算

mysql - 将 `INNER JOIN` 与多个数据库表语句一起使用时意味着什么/发生了什么?

sql - SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird

powershell - 使用 powershell 和 schtasks try catch 失败

azure-active-directory - JetBrains DataGrip - Azure SQL - 与 Active Directory 连接 - 密码

Powershell 不会循环遍历所有对象

.net - 有条件地删除powershell中的DataTable行?

sql-server - SQL Server Management Studio 2017 不显示在 SQL Server 2016 中创建的数据库

sql-server - SSMS 2016 导入 Azure SQL v12 bacpac 时出错 : master keys without password not supported