简单 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
我有以下查询,在 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