简单的SQL - 在openquery中使用格式

时间:2015-01-15 14:57:59

标签: sql-server formatting quoted-identifier wonderware

我在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'

但是我发现'错误'。关于在这种情况下我应该如何使用格式的任何建议?提前谢谢你的答案。 添加了快照,您必须在本地保存它才能读取它:enter image description here

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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()'
)

同时删除了示例中的最后一个单引号,因为我没有看到它关闭的内容。

答案 2 :(得分:0)

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

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

  

Msg 195,Level 15,State 10,Line 1    'bob'不是公认的内置函数名称。

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

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