2015-01-15 4 views
2

У меня есть следующий запрос с использованием MS SQL Server в приложении Wonderware (Industrial HMI) Historian. Ключевые слова, начинающиеся с «WW» являются Wonderware конкретные, wwResolution получает результаты каждые 24 часа:Простой SQL - использование формата в openquery

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

Я думаю, что это как-то связано с тем, как обрабатывается «Quoted Identifier».

+0

Какая версия SQL Server это? Может быть, не 'QUOTED_IDENTIFIER', поскольку я также могу отключить это и отправить аналогичный запрос, используя' FORMAT (поле, '###, ##. #') 'Без проблем. –

+0

И можете ли вы протестировать, изменив «#» на «1», чтобы увидеть, работает ли он, просто чтобы убедиться, что это сам знак фунта. Если это так, его, возможно, нужно будет избежать. –

+0

2008. Я только что обнаружил, что DDE сломан на этом поле, поэтому в ОС есть основные проблемы. Трюк «1» был отличной идеей, но не повезло. –

ответ

0

Проблема заключается в том, что функция FORMAT появилась в SQL Server 2012, и вы находитесь на SQL Server 2008, у которой ее нет.

Хотя, если представить запрос через OPENQUERY указав несуществующий функцию, я получаю:

Msg 195, Level 15, Состояние 10, строка 1
'боб' не является признанным построен -in имя функции.

Но у меня есть никаких проблем не работает следующим образом (на SQL Server 2012):

SET QUOTED_IDENTIFIER OFF; 
SELECT * 
FROM OPENQUERY([LOCAL], 
       "SELECT *, FORMAT(object_id,'#,#.#') FROM master.sys.objects;"); 
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()' 
) 

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

+0

Вы правы в том, как я использовал хэш-метки, но я все еще не могу вставить формат внутри запроса. Запрос становится частью активной заводской страницы, которая дает оператору ежедневное использование накопленного газового счетчика (их 13, я показал только 2). –

+0

@BillJ. К сожалению, я не знаком с набором чудаков только sql. Остается ли только сказать «Ошибка?»? Возможно ли, что ваша заводская страница сильно отображает результат где-то в виде числового типа вместо строки? – KHeaney

+0

Да, когда я пытаюсь поместить его в OPENQUERY, я получаю «Ошибка при выполнении запроса: неправильный синтаксис рядом с #» –

1

Я нашел решение. Он не изящный, но он работает для 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

Смежные вопросы