我需要在 Ansible 输出中捕获 MSSQL 查询的结果,但是没有支持的 Ansible 模块可以帮助我实现这一点。作为一种解决方法,我编写了一个 powershell 脚本,它运行 SQL 查询并以奇怪的格式返回输出,其中包含大量我想要删除的不必要的数据。
PowerShell 脚本
$ServerInstance = 'serverhostname'
$Database = 'master'
$Query = "DECLARE @sqlVers numeric(2,0)
DECLARE @compatlevel numeric(3,0)
SET @sqlVers = left(cast(serverproperty('productversion') as varchar), 2)
SET @compatlevel=@sqlVers*10
SELECT name,compatibility_level
FROM sys.databases WHERE compatibility_level<>@compatlevel"
$SqlcmdOptions = @"
-S"$ServerInstance" -d "$Database" -Q "$Query"
"@
Start-Process -FilePath "SQLCMD.EXE" -ArgumentList @"
$SqlcmdOptions
"@ -Wait -NoNewWindow -RedirectStandardOutput C:\temp\SQLCOMPLVL.txt -PassThru
Get-Content C:\temp\SQLCOMPLVL.txt
Powershell 脚本输出:
如何通过 Powershell 脚本或 ansible 格式化上述内容,以便我仅以以下方式获取数据:名称 comptibility_level 数据值
或者简而言之,我可以在之间获取数据姓名和(x 行受影响)并将其转换为 JSON 格式,以便 Ansible 可以以 JSON 格式收集 powershell 脚本输出。
答案1
评论太多了,所以
重定向到标准输出,您正在通过字符串化来破坏可能存在的对象。
$ServerInstance = 'serverhostname'
$Database = 'master'
$Query = "DECLARE @sqlVers numeric(2,0)
DECLARE @compatlevel numeric(3,0)
SET @sqlVers = left(cast(serverproperty('productversion') as varchar), 2)
SET @compatlevel=@sqlVers*10
SELECT name,compatibility_level
FROM sys.databases WHERE compatibility_level<>@compatlevel"
$SqlcmdOptions = @"
-S"$ServerInstance" -d "$Database" -Q "$Query"
"@
Start-Process -FilePath "SQLCMD.EXE" -ArgumentList @"
$SqlcmdOptions
"@ -Wait | Get-Member
查看 Get-Member 返回的内容
答案2
您可以使用 SQLPS 模块。
例子:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery" -ServerInstance "MyComputer\MainInstance"
查询时间
2017 年 9 月 21 日下午 2:48:24
查看以下链接:-