SQL Agent - PowerShell step "syntax error"
This is a not very intuitive and I was never able to find anything concrete on the explanation [e.g. no exact BOL or white paper was found].
The syntax error in the SQL Agent job is a T-SQL syntax error based on User Tokens. So that basically means that a PowerShell Sub-Expression Operator is treated as a Token to SQL Server Agent. So in PowerShell this $( )
appears to be treated as reserved character sequence for SQL Server Agent. So SQL Agent would be looking for something like this T-SQL example from the BOL article referenced:
PRINT N'Current database name is $(A-DBN)' ;
.
So in my script when it reached ,@DriveLetter = '$($c.DriveLetter)'
, the "$c.DriveLetter" is not one of the tokens allowed.
The workaround to this is simply to not use sub-expression statements in PowerShell. I would make the adjustments in my script so this:
$qAddServerDiskSpace = @"
EXEC [dbo].[StoredProcInsert]
@ServerName = '$($c.ServerName)'
,@DriveLetter = '$($c.DriveLetter)'
,@DiskSpaceCapacityGB = $($c.DiskSpaceCapacityGB)
,@DiskFreeSpaceGB = $($c.DiskFreeSpaceGB)
"@
would have to be modified to something like this:
$severName = $c.ServerName
$driveLetter = $c.DriveLetter
$capacityGB = $c.DiskSpaceCapacityGB
$freeGB = $c.DiskFreeSpaceGB
$qAddServerDiskSpace = @"
EXEC [dbo].[StoredProcInsert]
@ServerName = '$serverName'
,@DriveLetter = '$driveLetter'
,@DiskSpaceCapacityGB = $CapacityGB
,@DiskFreeSpaceGB = $freeGB
"@
Made the above adjustments to my script and it runs perfectly now.