Sql server 简单SQL-在openquery中使用格式

Sql server 简单SQL-在openquery中使用格式,sql-server,formatting,quoted-identifier,wonderware,Sql Server,Formatting,Quoted Identifier,Wonderware,在Wonderware Industrial HMI Historian应用程序中使用MS SQL Server,我有以下查询。以“ww”开头的关键字特定于Wonderware,wwResolution每24小时获取一次结果: 将带引号的U标识符设置为OFF SELECT * FROM OPENQUERY(INSQL, "SELECT DateTime = convert(nvarchar, DateTime, 101) + ' 23:59:59.000', [BarRoom_GASMETER

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

将带引号的U标识符设置为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()")'
我想尝试设置查询的格式,因此执行以下操作:

将[BarRoom_GASMETER.ACC]、、、、、、.格式设置为“酒吧间”

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


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

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

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

对于你的另一个问题,我发现了这个论坛帖子:看起来你的问题可能是由于达到了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()'
)

还从您的示例中删除了最后一个引用,因为我没有看到它结束了什么。

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

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

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

但在SQL Server 2012上运行以下操作也没有问题:

设置“U标识符”为OFF; 挑选* 从OPENQUERY[本地], 从master.sys.objects;中选择*,FORMATobject_id;;
我找到了解决办法。它并不优雅,但适用于Server2008和Wonderware。它将在午夜返回上个月的数据,格式设置为小数点后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

你才知道我是如何使用散列标记的,但我仍然无法在查询中嵌入格式。该查询成为活动工厂页面的一部分,该页面为操作员提供每日累计煤气表使用量。其中有13个,我只显示了2个。@BillJ。不幸的是,我不太熟悉wonderware suite only sql。它还是只说错误发生了吗?您的factory页面是否可能将结果强类型化为数字类型而不是字符串?是的,当我尝试将其放入OPENQUERY中时,会得到“执行查询时出错:附近的语法不正确”这是哪个版本的SQL Server?可能没有引用_标识符,因为我也可以关闭它,并使用FORMATfield,“,.”提交一个类似的查询,没有问题。您可以通过将参数更改为“可能1”进行测试,看看它是否有效,只是看看是否是英镑符号本身才是问题所在。如果是的话,它可能需要以某种方式逃脱。我刚刚发现那个盒子上的DDE坏了,所以操作系统存在核心问题。“1”是个好主意,但运气不好。