简单 SQL - 在 openquery 中使用格式

Simple SQL - using format inside openquery

我有以下查询,在 Wonderware(工业 HMI)Historian 应用程序中使用 MS SQL 服务器。以 'ww' 开头的关键字是 Wonderware 特定的,wwResolution 每 24 小时获取一次结果:

设置QUOTED_IDENTIFIER关闭

SELECT * FROM OPENQUERY(INSQL,
"SELECT DateTime = convert(nvarchar, DateTime, 101) + '  23:59:59.000',
[BarRoom_GASMETER.ACC], [DELAQ_GASMETER.ACC]
FROM WideHistory
WHERE wwRetrievalMode = 'Cyclic'
AND wwResolution = 86400000
AND wwVersion = 'Latest'
AND DateTime >= DateAdd(wk,-1,GetDate())
AND DateTime <= GetDate()")'

我想尝试格式化查询,所以我这样做了:

format([BarRoom_GASMETER.ACC],'###,###,###,###,###.##') as 'Bar Room'

但我得到 'Error Occurred'。关于在这种情况下我应该如何使用格式的任何建议?预先感谢您的回答。 添加快照,您必须将其保存在本地才能阅读:

我认为这与 'Quoted Identifier' 的处理方式有关。

您的格式中不需要所有这些额外的 # 符号。试试只用这个

format([BarRoom_GASMETER.ACC],'#,###.##') as 'Bar Room'

编辑

关于你的其他问题,我找到了这个论坛 post:http://www.plctalk.net/qanda/showthread.php?t=52677 看来你的问题可能是由于达到了 128 个字符的限制。这可能不再是这种情况,因为 post 已经超过一年了。

如果是这种情况,其中一位 post 作者提到要克服此限制,您需要交换查询中的单引号和双引号。这意味着您的新查询应如下所示:

SELECT * FROM OPENQUERY(INSQL,
    'SELECT DateTime = convert(nvarchar, DateTime, 101) + " 23:59:59.000",
        format([BarRoom_GASMETER.ACC],"#,###.##") as "Bar Room", 
        [DELAQ_GASMETER.ACC]
    FROM WideHistory
    WHERE wwRetrievalMode = "Cyclic"
        AND wwResolution = 86400000
        AND wwVersion = "Latest"
        AND DateTime >= DateAdd(wk,-1,GetDate())
        AND DateTime <= GetDate()'
)

还从您的示例中删除了最后一个单引号,因为我没有看到它关闭了什么。

问题似乎是 FORMAT 函数出现在 SQL Server 2012 而你在 SQL Server 2008 上没有它。

不过,如果我通过 OPENQUERY 提交查询并指定一个不存在的函数,我会得到:

Msg 195, Level 15, State 10, Line 1
'bob' is not a recognized built-in function name.

但我也没有问题 运行 以下(在 SQL Server 2012 上):

SET QUOTED_IDENTIFIER OFF;
SELECT *
FROM OPENQUERY([LOCAL],
               "SELECT *, FORMAT(object_id,'#,#.#') FROM master.sys.objects;");

我找到了解决办法。它并不优雅,但适用于 Server 2008 和 Wonderware Historinan。它将return上个月午夜的数据,格式化为小数点后两位。

SET QUOTED_IDENTIFIER OFF    
SELECT datetime , [BarRoom_GASMETER.ACC] = convert(decimal(38,2),             
[BarRoom_GASMETER.ACC])    
FROM OPENQUERY(INSQL, "SELECT Datetime , [BarRoom_GASMETER.ACC],     
FROM WideHistory    
WHERE [SysTimeHour] = 23    
AND [SysTimeMin] = 59    
AND wwRetrievalMode = 'Cyclic'    
AND wwResolution = 60000    
AND wwVersion = 'Latest'    
AND DateTime >= DateAdd(mm,-1,GetDate())    
AND DateTime <= getdate()    
")    

感谢@KHeaney 和@srutzky