【问题标题】:getting error incorrect syntax near the keyword as in sql server在关键字附近出现错误语法错误,如 sql server
【发布时间】:2018-02-03 02:22:35
【问题描述】:

我正在将 mysql 查询转换为 sql 查询我有以下查询,当我在 sql server 中运行此查询时,它说

Error 156: Incorrect syntax near the keyword 'as'.

谁能帮我解释一下为什么会出现这个错误?


Mysql 查询(这在 mysql 中运行良好):

UPDATE  tb_Episode as e left JOIN tb_Payer as p ON (e.CustID = p.company_id) AND (e.PayorType = p.payor_type)
                        left JOIN tb_HHPPS as h ON e.HHPPS = h.HHPPS
                        SET
                                e.PayerType = If(p.payer_type=1,"Ep","NonEp"),

                                e.LUPAAlert = If((p.payer_type)<>"1",0,If(EpEnd<=Now(),0,If(TotVisits<5,1,0))),
                                e.LUPADays = If((If((p.payer_type)<>"1",0,If(EpEnd<=Now(),0,If(TotVisits<5,1,0))))=0,0,EpEnd-Now()),
                                e.FinalAlert = If((p.payer_type)<>"1",0,If(abs(DATEDIFF(Now(),EpEnd))>1,0,1)),
                                e.FinalDays = If((If((p.payer_type)<>"1",0,If(abs(DATEDIFF(Now(),EpEnd))>1,0,1)))=1,abs(DATEDIFF(Now(),EpEnd)),0),
                                e.RAPAlert = If(p.payer_type="1",If(abs(DATEDIFF(Now(),EpStart))>0,1,0),0),
                                e.RAPDays = If((If(p.payer_type="1",If(abs(DATEDIFF(Now(),EpStart))>0,1,0),0))=1,abs(DATEDIFF(Now(),EpStart)),0)

                        where  e.billed_flag = "0"


SQLQuery(出现错误):

UPDATE  tb_Episode as e left JOIN tb_Payer as p ON (e.CustID = p.company_id) AND (e.PayorType = p.payor_type)
                        left JOIN tb_HHPPS as h ON e.HHPPS = h.HHPPS
                        SET
                                e.PayerType = IIF(p.payer_type=1,'Ep','NonEp'),

                                e.LUPAAlert = IIF((p.payer_type)<>"1",0,IIF(EpEnd<=getdate(),0,IIF(TotVisits<5,1,0))),
                                e.LUPADays = IIF((IIF((p.payer_type)<>"1",0,IIF(EpEnd<=getdate(),0,IIF(TotVisits<5,1,0))))=0,0,EpEnd-getdate()),
                                e.FinalAlert = IIF((p.payer_type)<>"1",0,IIF(abs(DATEDIFF(millisecond,getdate(),EpEnd))>1,0,1)),
                                e.FinalDays = IIF((IIF((p.payer_type)<>"1",0,IIF(abs(DATEDIFF(millisecond,getdate(),EpEnd))>1,0,1)))=1,abs(DATEDIFF(millisecond,getdate(),EpEnd)),0),
                                e.RAPAlert = IIF(p.payer_type="1",IIF(abs(DATEDIFF(millisecond,getdate(),EpStart))>0,1,0),0),
                                e.RAPDays = IIF((IIF(p.payer_type="1",IIF(abs(DATEDIFF(millisecond,getdate(),EpStart))>0,1,0),0))=1,abs(DATEDIFF(millisecond,getdate(),EpStart)),0)

                        where  e.billed_flag = '0'

【问题讨论】:

  • 简化查询以查找问题。 stackoverflow.com/help/mcve
  • 您的查询不是 SQL Server 语法。
  • (p.payer_type)&lt;&gt;"1" 进行一点代码审查(希望能阻止我的眼睛抽搐),payer_type 是数字还是字符数据类型?在后台,'1'1 之间存在差异。另外,"'.
  • 你检查过 MSDN 的 UPDATEJOIN 的语法吗?这可能是您在此处发布之前应该做的第一件事。显然你的语法是错误的。

标签: sql sql-server


【解决方案1】:

这应该可行。 SQL Server 不使用UPDATE [TABLE] AS [Alias] 的语法,它仍然需要FROM 子句。

UPDATE e 
SET e.PayerType = IIF(p.payer_type=1,'Ep','NonEp'),
    e.LUPAAlert = IIF((p.payer_type)<>'1',0,IIF(EpEnd<=getdate(),0,IIF(TotVisits<5,1,0))),
    e.LUPADays = IIF((IIF((p.payer_type)<>'1',0,IIF(EpEnd<=getdate(),0,IIF(TotVisits<5,1,0))))=0,0,EpEnd - CAST(getdate() as date)),
    e.FinalAlert = IIF((p.payer_type)<>'1',0,IIF(abs(DATEDIFF(millisecond,getdate(),EpEnd))>1,0,1)),
    e.FinalDays = IIF((IIF((p.payer_type)<>'1',0,IIF(abs(DATEDIFF(millisecond,getdate(),EpEnd))>1,0,1)))=1,abs(DATEDIFF(millisecond,getdate(),EpEnd)),0),
    e.RAPAlert = IIF(p.payer_type='1',IIF(abs(DATEDIFF(millisecond,getdate(),EpStart))>0,1,0),0),
    e.RAPDays = IIF((IIF(p.payer_type='1',IIF(abs(DATEDIFF(millisecond,getdate(),EpStart))>0,1,0),0))=1,abs(DATEDIFF(millisecond,getdate(),EpStart)),0)
FROM tb_Episode as e
LEFT JOIN tb_Payer as p ON (e.CustID = p.company_id) AND (e.PayorType = p.payor_type)
LEFT JOIN tb_HHPPS as h ON e.HHPPS = h.HHPPS
WHERE e.billed_flag = '0'

【讨论】:

  • 谢谢雅各布,我非常接近解决这个查询,我已经运行了查询,现在它说“数据类型日期和日期时间在减法运算符中不兼容。”为什么会出现这个错误?
  • 必须是EpEnd -getdate())。 EpEnd 是日期类型吗?
  • 喜欢:EpEnd - cast(getdate() as date)
  • 更新了查询以添加日期转换。
  • 我投了这个票,但为了正确起见,请修复"s。
【解决方案2】:

如果您像这样移动JOIN 语句,它可能会起作用:

UPDATE [e]
    SET 
        [e].[PayerType] = IIF([p].[payer_type] = 1, 'Ep', 'NonEp')
      , [e].[LUPAAlert] = IIF(([p].[payer_type]) <> "1", 0, IIF([EpEnd] <= GETDATE(), 0, IIF([TotVisits] < 5, 1, 0)))
      , [e].[LUPADays] = IIF((IIF(([p].[payer_type]) <> "1", 0, IIF([EpEnd] <= GETDATE(), 0, IIF([TotVisits] < 5, 1, 0)))) = 0, 0, [EpEnd] - GETDATE())
      , [e].[FinalAlert] = IIF(([p].[payer_type]) <> "1", 0, IIF(ABS(DATEDIFF([millisecond], GETDATE(), [EpEnd])) > 1, 0, 1))
      , [e].[FinalDays] = IIF((IIF(([p].[payer_type]) <> "1", 0, IIF(ABS(DATEDIFF([millisecond], GETDATE(), [EpEnd])) > 1, 0, 1))) = 1, ABS(DATEDIFF([millisecond], GETDATE(), [EpEnd])), 0)
      , [e].[RAPAlert] = IIF([p].[payer_type] = "1", IIF(ABS(DATEDIFF([millisecond], GETDATE(), [EpStart])) > 0, 1, 0), 0)
      , [e].[RAPDays] = IIF((IIF([p].[payer_type] = "1", IIF(ABS(DATEDIFF([millisecond], GETDATE(), [EpStart])) > 0, 1, 0), 0)) = 1, ABS(DATEDIFF([millisecond], GETDATE(), [EpStart])), 0)
FROM [tb_Episode] AS [e]
LEFT JOIN [tb_Payer] AS [p]
     ON([e].[CustID] = [p].[company_id])
       AND ([e].[PayorType] = [p].[payor_type])
LEFT JOIN [tb_HHPPS] AS [h]
     ON [e].[HHPPS] = [h].[HHPPS]
WHERE 
    [e].[billed_flag] = '0';

但是,由于缺少表定义和语句的复杂性,我无法测试此语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-18
    • 2019-12-22
    • 2015-03-07
    • 2018-08-02
    • 2018-07-17
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多