当前位置: 首页 > 知识库问答 >
问题:

使用python子进程执行SQLCMD

公孙宸
2023-03-14

我想从. dat文件恢复MSSQL数据库。

通过在Windows PowerShell上调用以下命令/语句或将其保存在一个文件夹中,我成功地做到了这一点。bat文件并运行文件本身:

sqlcmd -S POLIVEIRA-PC\MSSQLSERVER2008 -Q "RESTORE DATABASE [Odemira_2012-07-01_021501] FROM DISK=N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\Backup\ODEMIRA2013\Odemira_2012-07-01_021501' WITH FILE=1, MOVE N'Odemira_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501.MDF', MOVE N'Odemira_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501_1.LDF', NOUNLOAD, STATS=10"

但是,由于我需要在不同的数据库中多次重复此指令,因此我希望使用Python在循环中执行此操作。我尝试使用子流程模块复制上述指令。没有成功。

我的Python代码如下所示:

import subprocess

host = 'POLIVEIRA-PC\\MSSQLSERVER2008'
mssql_dir = 'C:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER2008\\MSSQL\\DATA\\'
db_dir = 'C:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER2008\\MSSQL\\Backup\\ODEMIRA2013\\'
db = 'Odemira_2012-07-01_021501'

statement = '"RESTORE DATABASE [' + db + '] FROM DISK=N\'' + db_dir + \
            db + '\' WITH FILE=1, MOVE N\'Odemira_Data\' TO N\'' + mssql_dir + \
            db + '.MDF\', MOVE N\'Odemira_Log\' TO N\'' + mssql_dir + \
            db + '_1.LDF\', NOUNLOAD, STATS=10"'

subprocess.call(["sqlcmd", "-S", host, "-Q", statement])

在Windows PowerShell上运行此python脚本时,出现以下错误:

PS C:\Users\POliveira\Dropbox\Academia\IST\Dissertacao_de_Mestrado\SQL> python .\lib\temp.py
Sqlcmd: 'RESTORE DATABASE [Odemira_2012-07-01_021501] FROM DISK=N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\Backup\ODEMIRA2013\Odemira_2012-07-01_021501' WITH FILE=1, MOVE N'Odemira_Data' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501.MDF', MOVE N'Odemira_Log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER2008\MSSQL\DATA\Odemira_2012-07-01_021501_1.LDF', NOUNLOAD, STATS=10\""': Unexpected argument. Enter '-?' for help.

我不知道我错过了什么。我试着用倒斜杠避开双引号(“RESTORE…10”),但也没用。

编辑:我确实尝试在子流程上添加标志shell=True。打电话,但我以同样的错误结束。

共有1个答案

郑俊美
2023-03-14

删除语句周围的双引号,如下所示:

statement = 'RESTORE DATABASE [' + db + '] FROM DISK=N\'' + db_dir + \
            db + '\' WITH FILE=1, MOVE N\'Odemira_Data\' TO N\'' + mssql_dir + \
            db + '.MDF\', MOVE N\'Odemira_Log\' TO N\'' + mssql_dir + \
            db + '_1.LDF\', NOUNLOAD, STATS=10'
 类似资料:
  • 问题内容: 我正在远程服务器上运行几个命令,并分别收集其输出以进行进一步处理: 但是,这会导致顺序执行subprocess(’ssh … cat …’)命令。第二高峰等待第一个完成,依此类推。 如何修改此代码,以使子流程调用并行运行,同时仍能够分别收集每个输出? 问题答案: 另一种方法(而不是将shell进程放在后台的其他建议)是使用多线程。 您所拥有的方法将执行以下操作: 要收集结果,您可以执行

  • 问题内容: 我想使用Python连接到远程服务器并在其上执行一个过程。我希望能够获得该过程的返回码和stderr(如果有)。以前有没有人做过这样的事情。我已经用ssh完成了,但是我想从Python脚本中完成。 干杯。 问题答案: 好吧,您可以从python调用ssh …

  • 我正在生成一个文本文件,稍后由外部程序处理。这必须执行1000次,为此,我使用一个子流程。在循环中为我要处理的每个文本文件调用()。 工作正常。 第二次调用失败,python程序以退出。 -没有调试输出。-两者都保持停止状态,但在进程列表中 我尝试了,结果是一样的。我试图用与第一次执行相同的文本文件运行它,但它也失败了,所以罪魁祸首肯定是函数。 这是调用外部程序的行 该程序是一个简单的二进制文件,

  • 本文向大家介绍python执行子进程实现进程间通信的方法,包括了python执行子进程实现进程间通信的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python执行子进程实现进程间通信的方法。分享给大家供大家参考。具体实现方法如下: a.py: b.py: 希望本文所述对大家的Python程序设计有所帮助。

  • 使用在python中,我试图运行一个perl脚本,它在远程机器上运行一个代码来获取一些信息。 我在机器A上有两个脚本—python和perl。python脚本使用方法。两个脚本都运行得很好。 但是,perl脚本是按串行顺序执行的(一个接一个的IP)。 实际行为- python脚本通过传递'198.168来运行perl脚本。1.2' perl脚本执行代码并Hibernate15秒 python脚本然

  • 问题内容: 我想同时运行许多进程并能够随时输出stdout。我该怎么办?我需要为每个调用运行线程吗? 问题答案: 您可以在一个线程中完成。 假设您有一个脚本可以随机打印行: 而且您想在输出可用后立即收集它,您可以按照@zigg的建议在POSIX系统上 使用: 更具可移植性的解决方案(应在Windows,Linux,OSX上运行)可以为每个进程使用读取器线程,请参阅python中的对子进程的非阻塞读