2013-08-27 13 views
0

我不知道如何在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 

回答

2

你能先嚐試把字符串日期在有這種格式的變種:

$FirstDayOfLastMonth.tostring("yyyy/MM/dd hh:mm:ss") 
$LastDayOfLastMonth.tostring("yyyy/MM/dd hh:mm:ss") 

這個想法是讓查詢字符串看起來像您在查詢管理器中使用的字符串。爲了您的調試assigne查詢字符串並打印它。

$a = @" 
    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 
"@ 

write-host $a 

Invoke-Sqlcmd -Query $a | Export-Csv -Path $LuckyDrawWinnerReportFilePath -NoTypeInformation -Encoding "UTF8" 

編輯

$(FirstDayOfLastMonth)是指沒有在你的情況下,你應該使用($FirstDayOfLastMonth)$($FirstDayOfLastMonth)

+0

謝謝你回答。在我投了$ LastDayOfLastMonth到目前爲止,它真的是我你是否介意解釋我的更新問題? – Mithril

+0

@Mithril我更新了我的答案。 – JPBlanc

0

這個工作對我沒有尷尬格式:

$timevariable = get-date 

$MyArray = "MyVar1 = '$timevariable' " 

Invoke-Sqlcmd -ServerInstance $server -Database $database -Query "insert SomeTable (datetimecolumn) VALUES (`$(MyVar1));" -Variable $MyArray -Verbose