【问题标题】:Unsure why this powershell is failing不确定为什么这个 powershell 失败了
【发布时间】: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


【解决方案1】:

我发现的问题是,在 Info、URL 和 CreateStatement 数据的某个地方,它通过使其认为正在插入更多数据而破坏了 powershell。删除这三列可以修复它。

要补充,最好用prepared statements用sql插入数据。

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2021-11-21
    相关资源
    最近更新 更多