2

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

SET QUOTED_IDENTIFIER OFF

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'

但我得到“发生错误”。在这种情况下我应该如何使用格式有什么建议吗?提前感谢您的答案。添加快照,您必须将其保存在本地才能阅读:在此处输入图像描述

我认为这与处理“引用标识符”的方式有关。

4

3 回答 3

2

我找到了解决方案。它并不优雅,但适用于 Server 2008 和 Wonderware Historinan。它将在午夜返回上个月的数据,格式为小数点后 2 位。

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

于 2015-01-16T20:30:44.340 回答
0

您不应该#在格式中需要所有这些额外的符号。尝试使用这个

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

编辑

对于您的其他问题,我发现此论坛帖子:http ://www.plctalk.net/qanda/showthread.php?t= 52677 看来您的问题可能是由于达到 128 个字符的限制。但是,由于该帖子已有一年多的历史,因此情况可能不再如此。

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

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()'
)

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

于 2015-01-15T15:40:41.277 回答
0

问题似乎是FORMAT函数出现在 SQL Server 2012 中,而您使用的 SQL Server 2008 没有它。

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

消息 195,级别 15,状态 10,第 1 行
“bob”不是可识别的内置函数名称。

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

SET QUOTED_IDENTIFIER OFF;
SELECT *
FROM OPENQUERY([LOCAL],
               "SELECT *, FORMAT(object_id,'#,#.#') FROM master.sys.objects;");
于 2015-01-15T16:25:34.197 回答