【发布时间】:2018-08-09 18:41:49
【问题描述】:
我之前没有使用过 Powershell 的经验。我正在尝试使用我从this 修改的脚本答案:
#call the sp_BlitzIndex procedure and specify the names and data types of the results;
#save the result set in the $BlitzIndex variable
$BlitzIndex = Invoke-Sqlcmd -ServerInstance $SQLInstance -Database DBAdmin -Query "EXEC ('exec ozar.sp_BlitzIndex @GetAllDatabases=1, @BringThePain=1, @Mode=0')
WITH RESULT SETS
(
(
[Priority] int
,[Finding] nvarchar(max)
,[DatabaseName] nvarchar(max)
,[Details] nvarchar(max)
,[Definition] nvarchar(max)
,[SecretColumns] nvarchar(max)
,[Usage] nvarchar(max)
,[Size] nvarchar(max)
,[Info] nvarchar(max)
,[URL] nvarchar(max)
,[CreateStatement] nvarchar(max)
)
)"
#Query the data that we want out of our $BlitzIndex result set, and set the $BlitzIndex result set to just contain that data
$BlitzIndex = $BlitzIndex | SELECT Priority,Finding,DatabaseName,Details,Definition,SecretColumns,Usage,Size,Info,URL | Where-Object {$_.Priority -gt 0} | Sort-Object Priority,Finding
#Loop through our desired results
foreach ($i in $BlitzIndex) {
#we have to set these variables to keep the PowerShell from erroring when encountering sub-expression statements
$Priority = $i.Priority
$Finding = $i.Finding
$DatabaseName = $i.DatabaseName
$Details = $i.Details
$Definition = $i.Definition
$SecretColumns = $i.SecretColumns
$Usage = $i.Usage
$Size = $i.Size
$Info = $i.Info
$URL = $i.URL
$CreateStatement = $i.CreateStatement
#Insert our results into our table
Invoke-Sqlcmd -ServerInstance $SQLInstance -Database DBAdmin -Query "INSERT INTO dbo.BlitzIndexResults (Priority,Finding,DatabaseName,Details,Definition,SecretColumns,Usage,Size,Info,URL,CreateStatement) VALUES ($Priority,'$Finding','$DatabaseName','$Details','$Definition','$SecretColumns','$Usage','$Size','$Info','$URL','$CreateStatement')"
}
表格定义:
create table [dbo].[BlitzIndexResults](
[PK_IndexResultsID] [int] identity(1,1) not null,
[Priority] [int] not null,
[Finding] [nvarchar](max) not null,
[DatabaseName] [nvarchar](max) not null,
[Details] [nvarchar](max) not null,
[Definition] [nvarchar](max) not null,
[SecretColumns] [nvarchar](max) not null,
[Usage] [nvarchar](max) not null,
[Size] [nvarchar](max) not null,
[Info] [nvarchar](max) not null,
[URL] [nvarchar](max) not null,
[CreateStatement] [nvarchar](max) not null,
[CaptureDate] [datetime] not null,
primary key clustered
(
[PK_IndexResultsID] asc
)with (pad_index = off, statistics_norecompute = off, ignore_dup_key = off, allow_row_locks = on, allow_page_locks = on) on [PRIMARY]
) on [PRIMARY] textimage_on [PRIMARY]
go
alter table [dbo].[BlitzIndexResults] add default (getdate()) for [CaptureDate]
go
我将此作为 SQL 代理作业的一部分,它会引发此错误:
作业步骤在 PowerShell 脚本的第 39 行收到错误。这 对应的行是' Invoke-Sqlcmd -ServerInstance $SQLInstance -Database DBAdmin -Query "INSERT INTO dbo.BlitzIndexResults (PriorityFindingDatabaseNameDetailsDefinitionSecretColumnsUsageSizeInfoURLCreateStatement) 价值观 ($Priority'$Finding''$DatabaseName''$Details''$Definition''$SecretColumns''$Usage''$Size''$Info''$URL''$CreateStatement')" '。更正脚本并重新安排作业。
我很确定我只是错过了一些微小的东西,我就是找不到。
【问题讨论】:
-
'$Finding'$Finding很确定你得到的答案有点混乱。 -
在这种情况下,'$Finding' 的语法是正确的。整个字符串用双引号括起来,因此变量将被推断为它的值,并且您最终会在查询中得到类似 'SOMEVALUE' 的内容,这是 SQL 的正确语法.
-
啊,好电话。不知道为什么它会失败。我假设存储过程也已部署? DBAdmin 是正确的数据库吗?等
-
@JacobH 是的,如果我从 powershell 中提取执行语句并运行它,它工作正常。我还确保该表存在。
-
错误信息很奇怪,就像你所有的逗号都被去掉了。不确定这是否是一个红鲱鱼。
标签: sql-server powershell