2015-04-09 2 views
0

Я хочу выполнить это из Excel (окно запроса SQL), где я обычно выполнял бы только оператор select. Должен ли я сделать это в сохраненной процедуре, а затем выполнить tat из Excel?Является ли это сохраненным способом t sql

BEGIN TRY 

    drop table GlobalShop.dbo.v_order_hist_dtl_Quote 
END TRY 
BEGIN CATCH 

END CATCH 

BEGIN TRY 

    drop table GlobalShop.dbo.v_order_lines_Quote 
END TRY 
BEGIN CATCH 

END CATCH 


select * into GlobalShop.dbo.v_order_hist_dtl_Quote 
from GlobalShop.dbo.v_order_hist_dtl where isnull(USER_3,'') <> '' 
select * into GlobalShop.dbo.v_order_lines_Quote 
from GlobalShop.dbo.v_order_lines where isnull(USER_3,'') <> '' 



/* Quotes with Orders 1.0 */ 
select 
QT.QuoteNum, 
QT.custID, 
QT.QCustNum, 
QT.QCustName, 
QT.QDate, 
COUNT(OL.order_no) as #_Open_Orders, 
COUNT(OH.order_no) as #_Closed_Orders 
from 
"Track Quotes".dbo.TrackQuotesHist as QT 
left outer join GlobalShop.dbo.v_order_hist_dtl_quote as OH 
on QT.QuoteNum = OH.USER_3 
left outer join GlobalShop.dbo.v_order_lines_quote as OL 
on QT.QuoteNum = OL.USER_3 
where 
QT.QDate between '03/01/2015' and '03/06/2015' 
Group By 
QT.QuoteNum, 
QT.custID, 
QT.QCustNum, 
QT.QCustName, 
QT.QDate 
+0

Да, это было бы отличным кандидатом на хранимую процедуру. Однако у вашего кода два недостатка MAJOR. У вас есть два блока catch, которые пусты. Это ужасная идея. Это НЕ обрабатывает ошибки, они подавляют их. Зачем беспокоиться об ошибке, если вам все равно, случилось это или нет? –

+0

Цель состоит в том, чтобы удалить таблицы, если они есть, а затем создать новые, а затем запустить отчет. Мне не интересно запускать отдельный скрипт, если там нет таблиц, просто продолжайте. –

+0

В этом случае я бы использовал sql в вашей процедуре вместо пустой catch. Это огромный красный флаг, когда вы впервые его видите. Особенно, если ошибка является ошибкой разрешений, остальная часть вашего кода все равно может выйти из строя. –

ответ

0

Если вы хотите запустить операторов выбора большую часть времени я бы капли в одну хранимую процедуру (если вы хотите сделать это), а затем выберите в другой.

+0

Я придерживался своего первоначального использования TRY CATCH, потому что он работает плавно, и я не заинтересован в создании массажа ошибок. Я изменил мою процедуру, показанную ниже, и она работает; ура - моя первая хранимая процедура. Моя новая проблема заключается в том, что я могу выполнить процедуру из окна Excel OLE DB Query. Мне придется исследовать это отдельно. –

0

В моем мире я предполагаю, что объект, который начинается с v_ вид, но вы, кажется, относиться к нему как таблица, и если это изменить его на что-то вроде этого:

create proc dbo.procfiles 
as 
BEGIN 
    if object_id('GlobalShop.dbo.v_order_hist_dtl_Quote','U') is not null 
     drop table GlobalShop.dbo.v_order_hist_dtl_Quote 

    if object_id('GlobalShop.dbo.v_order_lines_Quote','U') is not null 
     drop table GlobalShop.dbo.v_order_lines_Quote 

select * into GlobalShop.dbo.v_order_hist_dtl_Quote 
from GlobalShop.dbo.v_order_hist_dtl where user_3 is not null 

select * into GlobalShop.dbo.v_order_lines_Quote 
from GlobalShop.dbo.v_order_lines where user_3 is not null  

/* Quotes with Orders 1.0 */ 
select 
QT.QuoteNum, 
QT.custID, 
QT.QCustNum, 
QT.QCustName, 
QT.QDate, 
COUNT(OL.order_no) as #_Open_Orders, 
COUNT(OH.order_no) as #_Closed_Orders 
from 
"Track Quotes".dbo.TrackQuotesHist as QT 
left outer join GlobalShop.dbo.v_order_hist_dtl_quote as OH 
on QT.QuoteNum = OH.USER_3 
left outer join GlobalShop.dbo.v_order_lines_quote as OL 
on QT.QuoteNum = OL.USER_3 
where 
QT.QDate between '03/01/2015' and '03/06/2015' 
Group By 
QT.QuoteNum, 
QT.custID, 
QT.QCustNum, 
QT.QCustName, 
QT.QDate 

begin catch 
select 
ERROR_NUMBER(), 
      ERROR_SEVERITY(), 
      ERROR_STATE(), 
      ERROR_PROCEDURE(), 
      ERROR_LINE(), 
      ERROR_MESSAGE() 
end catch 

end 
+0

Согласен. Это фактические таблицы, отраженные от широко распространенных представлений базы данных. Как я уже сказал выше, я использую только try и catch, чтобы отбрасывать таблицы, если они существуют; не заинтересованы в том, чтобы знать, были ли они или нет. Я должен изменить свой первоначальный вопрос. Я бы хотел, чтобы таблицы drop и создавали новые в процедуре, потому что оператор select будет поступать из Excel с динамическим параметром для диапазона дат. Я сохраняю код SQL на листе со встроенными функциями для динамических параметров следующим образом: = «QT.QDate между« »и« ТЕКСТ »(QuoFrom,« mm/dd/yyy ») и« »и« »и TEXT (QuoTo,« mm/dd/yyy ") &" '". –

+0

Логика заключается в том, что если существуют существующие таблицы, их можно удалить. Затем вы можете безопасно выбирать. Пожалуйста, отметьте один или несколько ответов в качестве приемлемых, если вам нравится ответ (ы). –

+0

Итак, я хотел бы создать процедуру, затем выполнить ее из Excel перед оператором select. –

0

Если у вас очень убедительная причина для обновления этих таблиц каждый раз, когда этот запрос выполняется, я бы избегал их. Просто используйте эквивалентный запрос без использования таблиц:

select 
    QT.QuoteNum, 
    QT.custID, 
    QT.QCustNum, 
    QT.QCustName, 
    QT.QDate, 
    COUNT(OL.order_no) as #_Open_Orders, 
    COUNT(OH.order_no) as #_Closed_Orders 
from "Track Quotes".dbo.TrackQuotesHist as QT 
left outer join GlGlobalShop.dbo.v_order_hist_dtl OH 
on QT.QuoteNum = OH.USER_3 
    and isnull(QT.QuoteNum,'')<>'' 
left outer join GlobalShop.dbo.v_order_lines OL 
on QT.QuoteNum = OL.USER_3 
    and isnull(QT.QuoteNum,'')<>'' 
where QT.QDate between '03/01/2015' and '03/06/2015' 
Group By 
    QT.QuoteNum, 
    QT.custID, 
    QT.QCustNum, 
    QT.QCustName, 
    QT.QDate 
+0

GlobalShop.dbo.v_order_hist_dtl имеет более 200 тыс. Записей, а подавляющее большинство не имеют данных в user_3. Что-то связано с этим сервером, и я не собираюсь обращаться к нему прямо сейчас, так что это просто работа. Записанный вами запрос занимает более 20 минут. Выполнение всего скрипта, как я писал, занимает около 10 секунд. –

+0

А, да, мне нужно было сделать так, как раньше. Вероятно, это полезно для временной таблицы. –

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