繁体   English   中英

Powershell Invoke-Sqlcmd使用日期类型变量

[英]Powershell Invoke-Sqlcmd use date type variable

我不知道如何在Invoke-Sqlcmd中使用Powershell变量。
我在msdn emxample中看到了

 $MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
 Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray

,但似乎不是我所需要的。我也无法理解示例, $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的新手,这个问题可能很简单,但是很长时间以来我一直在搜索invoke-sqlcmd date变量和其他按键,但没有找到有用的东西。 如果您能提供帮助,我们将不胜感激。


更新
我像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

您能否首先尝试使用以下格式将字符串日期放入var中:

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

想法是让查询字符串看起来像您要在查询管理器中使用的字符串。 为了进行调试,将查询分配给字符串并打印。

$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)

这对我来说没有笨拙的格式工作:

$timevariable = get-date

$MyArray = "MyVar1 =  '$timevariable' "

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM