【问题标题】:Powershell Invoke-Sqlcmd use date type variablePowershell Invoke-Sqlcmd 使用日期类型变量
【发布时间】:2013-08-27 03:00:25
【问题描述】:

我不知道如何在 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日期变量和其他关键工作很长时间,没有找到任何有用的东西。 如果您能提供帮助,我将不胜感激。


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

【问题讨论】:

    标签: sql powershell


    【解决方案1】:

    你能不能先尝试用这种格式把字符串日期放在你的变量中:

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

    【讨论】:

    • 感谢您的回答。在我将 $LastDayOfLastMonth 投射到日期之后,它确实有效。您介意解释一下我的更新问题吗?
    【解决方案2】:

    这对我有用,没有尴尬的格式:

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

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 2013-05-15
      • 2016-01-15
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多