Простой 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()'
)

Также удалил последнюю одиночную кавычку из вашего примера, так как я не увидел, что она закрыла.

Другие вопросы по тегам