PowerShell 错误 - 无法绑定多部分标识符"System.Data.DataRow"



我在下面运行PS脚本

$prioryear = "select convert(char,(SELECT DATEADD(yy, -1,DATEADD(dd, -1, DATEADD(qq, DATEDIFF(qq, 0, GETDATE()), 0)))), 23) as prioryear"
--Above runs OK
Declaring prioryear as varchar in the query
$SQLquery = "
declare @prioryear varchar(50) = $prioryear_day
declare @sql nvarchar(1000)
set @sql = 'select bp3.sedol, b.benchmark_name, b.description ,bp3.price as '' ' + @prioryear + ' ''
FROM
dbo.ds_benchmark_prices bp1
left join dbo.ds_benchmark_prices bp2 on bp1.sedol= bp2.sedol
left join dbo.ds_benchmark_prices bp3 on bp1.sedol= bp3.sedol
where convert(char,bp3.price_date,23)=$prioryear_day -- prior year 
order by b.sedol'
exec (@sql)
"
#Invokve statements are below - Running both below Invoke causes error. If I comment out second invoke statements, it runs OK. Seems an issue with the way I declared prioryear_day????
$prioryear_day=Invoke-Sqlcmd -Query $prioryear -ServerInstance "UKWAR01APWPDWHERESCAPE" -Database RJISDWH
$SqlConnection=Invoke-Sqlcmd -Query $SQLquery -ServerInstance "UKWAR01APWPDWHERESCAPE" -Database RJISDWH | Export-CSV $outputFile -NoTypeInformation

错误调用- sqlcmd:多部分标识符"System.Data.DataRow"不能被束缚。多部分标识符"system . data . datarow";不能被束缚。4104号电话,16层,第一状态,程序,3号线。在C:UserskbraxtonDesktopUntitled8.ps1:56 char: 16

  • …$SQLquery -ServerInstance "UKWAR01AP…
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    • CategoryInfo: InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
    • fulllyqualifiederrid: SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand

,

该症状表明您正在尝试将类型为System.Data.DataRow对象嵌入到$SQLquery查询字符串中,这可预见会失败,因为这些实例按其类型名称进行字符串化,如错误消息中所报告的那样。

事实上,Invoke-SqlCmd在默认情况下返回System.Data.Row实例流,因此您需要从中提取感兴趣的列值,包含在唯一行的prioryear列中,在您的情况下:

$prioryear_day = (
Invoke-Sqlcmd -Query $prioryear -ServerInstance "UKWAR01APWPDWHERESCAPE" -Database RJISDWH
).prioryear

现在$prioryear_day是一个包含实际查询结果的字符串,您可以将其嵌入到$SQLquery查询字符串中。


作为题外话:一般来说,最好使用参数化的查询,以避免SQL注入的风险;不幸的是,Invoke-SqlCmd并没有强有力地支持这一点。有关更多信息和备选方案,请参阅此回答。

我需要将变量转换为日期时间

declare @prioryear datetime = '$prioryear_day'
declare @previousquarter datetime = '$previousquarter_day'
declare @lastquarter datetime = '$lastquarter_day

这就解决了问题。

相关内容

最新更新