Простой SQL - использование формата внутри openquery
У меня есть следующий запрос, используя MS SQL Server в приложении Historian Wonderware (Industrial HMI). Ключевые слова, начинающиеся с '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'
но я получаю "Ошибка произошла". Любые предложения о том, как я должен использовать формат в этом случае? Заранее спасибо за ответы. Добавленный снимок, вам нужно будет сохранить его локально, чтобы прочитать его:
Я думаю, что это как-то связано со способом обработки "цитируемого идентификатора".
3 ответа
Кажется, проблема в том, что функция 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;");
Я нашел решение. Это не элегантно, но работает для 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
Вам не нужно все эти дополнительные #
знаки в вашем форматировании. Попробуйте просто использовать это
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()'
)
Также удалил последнюю одиночную кавычку из вашего примера, так как я не увидел, что она закрыла.