【问题标题】:Case Statement In Update Query更新查询中的案例语句
【发布时间】:2015-12-01 15:09:00
【问题描述】:

这在 SQL Server 中有效,但每当我尝试在我的 powershell 环境中运行它时,它都会在 d 附近出现语法错误的错误。为了在 powershell 中运行,我必须改变什么?

Function Run-Query
{
    param([string[]]$queries)

        $server='Server'
        $dbname='Database'
        $connStr='Server={0};Database={1};Integrated Security=SSPI;' -f $server,$dbname
        For ($i = 0; $i -lt $queries.count; $i++)
        {
            $Command = New-Object System.Data.SqlClient.SqlCommand
            $conn=New-Object System.Data.SqlClient.SQLConnection($connStr)
            $conn.Open()            
            $Command.Connection = $conn
            $Command.CommandText=$queries[$i]
            $Command.ExecuteNonQuery() 
            $conn.Close()
        }
}

$updatequery = "UPDATE d
                 SET [updatedate] = GETDate(),
                 [shipped] =
                         (
                            CASE WHEN NOT EXISTS(Select 1 *
                                                 from [server].[db].[dbo].[viewname] vw
                                                 WHERE vw.customername = d.customername)                    
                                THEN 'Yes'
                            ELSE
                                'PreviousCustomer'
                            END
                         )
                 FROM $fulllocation
                 WHERE ([shipped] IS NULL) 
                 AND ([managerapproved] IS NOT NULL)  
                 AND [readytoship] IN ('Go', 'Ready', 'Send')"


 Run-Query -queries $updatequery

【问题讨论】:

  • 为什么是+=?您是否先定义了一个空数组?您可能想尝试使用 @"my string" 语法逐字制作字符串。
  • @arco444 - 不,这只是我的错字。删除它仍然会引发相同的错误。
  • 我希望它已修复。我用来执行此任务的一种方法是在 SQL Server 上运行查询后将 que 查询保存在文件中,然后使用命令 $query= get-content PATH TO QUERY FILE -Delimiter "{FIM} 将查询放入变量中" 我为它添加了分隔符来抓取内容,直到文件末尾作为一个字符串而不是字符串数组 SQL Server 2012,后来附带了包含 Invoke-SqlCmd 命令的 SQLPS 模块。创建此功能有一个特定原因?如果您想使用这种方法,请告诉我,我会发送给您。

标签: powershell powershell-ise


【解决方案1】:

将您的查询定义为这样的字符串文字:

$updatequery = @"
                     UPDATE d
                     SET [updatedate] = GETDate(),
                     [shipped] =
                             (
                                CASE WHEN NOT EXISTS(Select 1 
                                                     from [server].[db].[dbo].[viewname] vw
                                                     WHERE vw.customername = d.customername)                    
                                    THEN 'Yes'
                                ELSE
                                    'PreviousCustomer'
                                END
                             )
                     FROM $fulllocation
                     WHERE ([shipped] IS NULL) 
                     AND ([managerapproved] IS NOT NULL)  
                     AND [readytoship] IN ('Go', 'Ready', 'Send')
"@

【讨论】:

  • 当然,我必须在 select 语句中添加 * 才能使其正常工作。以为我会为其他遇到此问题的人添加。
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多