我不知道如何在Invoke-Sqlcmd中使用Powershell變量。
我msdn emxample:
Powershell Invoke-Sqlcmd使用日期類型變量
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
已經看到,但似乎不是我need.And我也無法理解的例子,$MyArray = "MyVar1 = 'String1'"
,MyVar1
是可變的名稱和String1
是變量?填充到sql命令將會是SELECT MyVar1 = 'String1' AS Var1
;但是var1
是什麼意思?
我的代碼:
$FirstDayOfLastMonth = (Get-Date -Day 1 -hour 0 -Minute 0 -Second 0).AddMonths(-1)
$LastDayOfLastMonth = (Get-Date -Day 1 -hour 23 -Minute 59 -Second 59).AddMonths(-1).AddDays([DateTime]::DaysInMonth($FirstDayOfLastMonth.year, $FirstDayOfLastMonth.month) - 1)
Write-Verbose "Invoke-Sqlcmd for winners"
Invoke-Sqlcmd -Query @"
use iMAG;
select L.Name AS LuckyDrawName, P.ParticipationTime, Z.Name as PrizeName, W.MobileNumber, T.ParticipantUniqueIdentifier
FROM LuckyDrawWinner W
INNER JOIN LuckyDrawParticipation P ON P.LuckyDrawParticipationId = W.LuckyDrawParticipationId
INNER JOIN LuckyDrawParticipant T ON T.LuckyDrawParticipantId = P.LuckyDrawParticipantId
INNER JOIN LuckyDrawPrize Z ON Z.LuckyDrawPrizeId = W.LuckyDrawPrizeId
INNER JOIN LuckyDraw L ON L.LuckyDrawId = Z.LuckyDrawId
WHERE cast(P.ParticipationTime AS date) < $LastDayOfLastMonth And cast(P.ParticipationTime AS date) > $FirstDayOfLastMonth
and L.LuckyDrawId IN (3) and Z.Grade <> 0
"@ | Export-Csv -Path $LuckyDrawWinnerReportFilePath -NoTypeInformation -Encoding "UTF8"
直接使用$LastDayOfLastMonth
不起作用。我也在Invoke-Sqlcmd中嘗試cast($LastDayOfLastMonth AS date)
。
然後嘗試$s = $FirstDayOfLastMonth.ToString("yyyy-MM-dd HH:mm:ss")
,然後使用cast($s AS date)
。兩者都不起作用。
輸出錯誤:
Invoke-Sqlcmd : Incorrect syntax near '23'.
At D:\ScheduledTasks\EmailReport\DailyEmailReport.ps1:32 char:14
+ Invoke-Sqlcmd <<<< -Query @"
+ CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException
+ FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
我是新來的PowerShell,這個問題也許很簡單,但我已經尋找調用-SQLCMD日期變量和其他keywork很長一段時間沒有什麼用處發現的。 如果你能提供幫助,我將不勝感激。
更新:
修改我的代碼MSDN那樣:
$Vars="FirstDayOfLastMonth='$FirstDayOfLastMonth'", "LastDayOfLastMonth='$LastDayOfLastMonth'"
Invoke-Sqlcmd -Query @"
use iMAG;
select L.Name AS LuckyDrawName, P.ParticipationTime, Z.Name as PrizeName, W.MobileNumber, T.ParticipantUniqueIdentifier
FROM LuckyDrawWinner W
INNER JOIN LuckyDrawParticipation P ON P.LuckyDrawParticipationId = W.LuckyDrawParticipationId
INNER JOIN LuckyDrawParticipant T ON T.LuckyDrawParticipantId = P.LuckyDrawParticipantId
INNER JOIN LuckyDrawPrize Z ON Z.LuckyDrawPrizeId = W.LuckyDrawPrizeId
INNER JOIN LuckyDraw L ON L.LuckyDrawId = Z.LuckyDrawId
WHERE cast(P.ParticipationTime AS date) > $(FirstDayOfLastMonth) AND cast(P.ParticipationTime AS date) < $(LastDayOfLastMonth)
and L.LuckyDrawId IN (3) and Z.Grade <> 0
"@ -Variable $Vars | Export-Csv -Path $LuckyDrawWinnerReportFilePath -NoTypeInformation -Encoding "UTF8"
但事實證明:
The term 'FirstDayOfLastMonth' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of
the name, or if a path was included, verify that the path is correct and try again.
At D:\ScheduledTasks\EmailReport\iDQDailyEmailReport.ps1:45 char:20
+ FirstDayOfLastMonth <<<<
+ CategoryInfo : ObjectNotFound: (FirstDayOfLastMonth:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : CommandNotFoundException
謝謝你回答。在我投了$ LastDayOfLastMonth到目前爲止,它真的是我你是否介意解釋我的更新問題? – Mithril
@Mithril我更新了我的答案。 – JPBlanc