从sqlcmd.exe远程获取SQL值

时间:2019-02-07 21:47:06

标签: powershell sqlcmd invoke-command

由于未安装sqlcmd,因此应在数据库上远程执行SQL命令。

$Configuration = Invoke-Command -ComputerName $dataserverName -Credential $cred -ScriptBlock {
    sqlcmd.exe -S $using:dataserver -U $using:user -P $using:pass -d $using:database -q $using:SQLQuery
}

因此,当我执行请求时,我在同一块中得到了响应,因此无法从这样的每一列中获取价值:

MinimumSize          MaximumSize          Delimiter             IdFile
-------------------- -------------------- --------- ----------------------
                NULL                 NULL         |                   6

(1 rows affected)

所以如果我做$Configuration[0],我会

$Configuration[0] = MinimumSize          MaximumSize          Delimiter             IdFile

像一条线,所以我什么也不能做。 我的问题是如何获取例如$Configuration.IdFile = 6

1 个答案:

答案 0 :(得分:0)

我也曾在不存在Invoke-Sqlcmd且不允许安装软件的系统上使用。 SQLCMD.exe返回一个表示每个返回行的字符串数组,而不是像Invoke-Sqlcmd这样的对象,因此您必须解析$ Configuration [2]。

但这是一个技巧:更改SQL语句以返回XML而不是表,然后您可以让Powershell为您进行解析。您没有提供SQL,但是很容易对其进行调整以满足您的需求:

$SQL = @"
   SET NOCOUNT ON
   DECLARE @XML AS XML
   SET @XML = (--change this SELECT statement to match yours, but keep the 'AS Row' table alias:
     SELECT Name, recovery_model_desc 
     FROM master.sys.databases AS Row 
     FOR XML AUTO, ROOT('table') -- also keep this line 
   )
   SELECT CAST (@XML AS nvarchar(max))  -- do this to prevent SQLCMD adding line breaks   
"@
[string] $output = (SQLCMD -S 'YOUR_SQL_SERVER' -E -h-1 -y0 -Q $SQL)
([xml] $output).table.Row[0].Name #now you have an array of rows and can reference each field
([xml] $output).table.Row | Out-GridView #you can also put all the rows into a GridView!