Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将MySQL查询转换为SQL Server_Mysql_Sql Server - Fatal编程技术网

将MySQL查询转换为SQL Server

将MySQL查询转换为SQL Server,mysql,sql-server,Mysql,Sql Server,任何人都可以帮助将下面的MySQL查询转换为SQL Server “日期格式”和限制:限制是问题所在 SELECT DATE_FORMAT(e.eventTime, '%m/%d/%Y %h:%i:%s %p') eventTime, e.displayPath, SUBSTRING_INDEX(source, '/alm:', -1) name, e.eventType, CASE WHEN e.priority = 0 THEN 'Diagnost

任何人都可以帮助将下面的MySQL查询转换为SQL Server

“日期格式”和限制:限制是问题所在

SELECT 
    DATE_FORMAT(e.eventTime, '%m/%d/%Y %h:%i:%s %p') eventTime,
    e.displayPath, 
    SUBSTRING_INDEX(source, '/alm:', -1) name,
    e.eventType,
    CASE WHEN e.priority = 0 THEN 'Diagnostic' WHEN e.priority = 1 THEN 'Low' WHEN e.priority = 2 THEN 'Medium' WHEN e.priority = 3 THEN 'High' WHEN e.priority = 4 THEN 'Critical' ELSE '' END priority,
    COALESCE(COALESCE(COALESCE(d.intvalue, d.floatvalue), d.strvalue), '') eventValue,
    COALESCE(ack.strvalue, '') ackUser
FROM 
    alarm_events e 
        LEFT JOIN alarm_event_data d ON d.id = e.id AND d.propname = 'eventValue' 
        LEFT JOIN alarm_event_data ack ON ack.id = e.id AND ack.propname = 'ackUser'
WHERE 
    eventtime BETWEEN :startDate AND :endDate AND priority BETWEEN :minPriority AND :maxPriority AND
    ((:active AND e.eventtype = 0) OR (:clear AND e.eventtype = 1) OR (:ack AND e.eventtype = 2))
ORDER BY 
    e.eventTime DESC
LIMIT :limit

SQL中的变量使用@而不是:所以您需要对此进行调整,并从应用程序中填充变量

您可以用@LIMIT开始查询,而不是LIMIT参数

需要将SUBSTRING_INDEX函数调整为标准SUBSTRING和PATINDEX函数

您需要使用函数()代替DATE_FORMAT()

如注释中所述,在SQL Server中使用其他COALESCE()函数是不必要的

因此,最终的查询看起来像这样(变量由调用程序设置):


您当前的查询是否在MySQL上运行?AFAIK
LIMIT
后面的值不能是语句参数。您尝试了什么?您是否进行过任何互联网搜索或阅读过手册中的任何内容?找到与
LIMIT
等效的SQL Server可能比编写此问题更容易。您阅读了SQL Server文档了吗?仅供参考,您不需要像这样嵌套合并。它按照输入的顺序进行处理,并且需要2个以上的输入。
SELECT TOP (@limit)
    FORMAT(e.eventTime, 'M/d/yy hh:mm:ss tt') eventTime,
    e.displayPath, 
    SUBSTRING(source, patindex(source,'/alm:'),len(source)) name,
    e.eventType,
    CASE WHEN e.priority = 0 THEN 'Diagnostic' WHEN e.priority = 1 THEN 'Low' WHEN e.priority = 2 THEN 'Medium' WHEN e.priority = 3 THEN 'High' WHEN e.priority = 4 THEN 'Critical' ELSE '' END priority,
    COALESCE(d.intvalue, d.floatvalue, d.strvalue, '') eventValue,
    COALESCE(ack.strvalue, '') ackUser
FROM 
    alarm_events e 
        LEFT JOIN alarm_event_data d ON d.id = e.id AND d.propname = 'eventValue' 
        LEFT JOIN alarm_event_data ack ON ack.id = e.id AND ack.propname = 'ackUser'
WHERE 
    eventtime BETWEEN @startDate AND @endDate AND priority BETWEEN @minPriority AND @maxPriority AND
    ((@active AND e.eventtype = 0) OR (@clear AND e.eventtype = 1) OR (@ack AND e.eventtype = 2))
ORDER BY 
    e.eventTime DESC