Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Падает джоб. Посоветуйте как правильно ловить ошибку.

Доброго времени суток.
Джоб пробегается по некоторым объектам (заказам) и выполняет по ним запрос на Оракловом сервере (linked server). Несколько дней как джоб начал падать (вижу в истории Серьезность Sql 16, Идентификатор Sql-сообщения 3621). В своем логе вижу старт выборки, но не вижу ни окончания, ни ошибки. Как я понимаю рвется коннект и блок catch просто не срабатывает. С темиже параметрами и правами из SMS выборка отрабатывает.
Вопрос в том - как правильно обрабатывать такие ситуации? Как получить таки сообщение об ошибке?

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64>
Ответ:
denis_viktorovich
Ближе к концу списка происходит нечто, в результате чего не срабатывает блок внутри begin catch / end catch, не логируются окончание запроса и ошибка.


The following types of errors are not handled by a CATCH block when they occur at the same level of execution as the TRY…CATCH construct:

- Compile errors, such as syntax errors, that prevent a batch from running.
- Errors that occur during statement-level recompilation, such as object name resolution errors that occur after compilation because of deferred name resolution.

These errors are returned to the level that ran the batch, stored procedure, or trigger
Вопрос: Падает джоб. Посоветуйте как правильно ловить ошибку.

Доброго времени суток.
Джоб пробегается по некоторым объектам (заказам) и выполняет по ним запрос на Оракловом сервере (linked server). Несколько дней как джоб начал падать (вижу в истории Серьезность Sql 16, Идентификатор Sql-сообщения 3621). В своем логе вижу старт выборки, но не вижу ни окончания, ни ошибки. Как я понимаю рвется коннект и блок catch просто не срабатывает. С темиже параметрами и правами из SMS выборка отрабатывает.
Вопрос в том - как правильно обрабатывать такие ситуации? Как получить таки сообщение об ошибке?

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64>
Ответ: StarikNavy, ясно. Спасибо.
Вопрос: Посоветуйте правильно написать запрос

Привет, ребята !

Посоветуйте правильно написать запрос SQL.

Входные данные следующие:

There are two tables Countries and Cities.

Countries:
country_id
name

Cities:
city_id
name
country_id
population

Each city is applied to country as many to one. And not all countries has cities.

Необходимо:
1. Return population for countries (zero if country doesn't have cities).
2. Return country name where amount of cities between 3 and 6

Заранее благодарен !!!! )
Ответ: Спасибо ребята за помощь )))
Вопрос: ORDER BY как правильно составить. Ошибка: SELECT list is not in GROUP BY clause and contai

В MySQL 5.7 появляется ошибка:

Mysqli prepare error: Expression #142 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mnbcz_arenda.kfk.kvartira_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

SELECT `kv`.*, `metro`.`line` AS `metro_line`, `metro`.`name` AS `metro_name`, `metro`.`udalennost` AS `metro_udalennost`, `metro`.`is_top` AS `metro_is_top`, (SELECT COUNT(*) FROM kvartirant pk WHERE pk.telefon = kv.telefon) AS `num_dublikat`, `kfk`.`kvartira_id` AS `kfk_kvartira_id` FROM `temp_klient_search_75135` AS `kv` LEFT JOIN `_gorod2_metro` AS `metro` ON metro.id = kv.metro_id LEFT JOIN `kvartiri_for_klient` AS `kfk` ON kv.id = kfk.klient_id GROUP BY `kv`.`id`, `kfk_kvartira_id` ORDER BY `id_temp` ASC


Как исправить? Как правильно составить запрос соответствующий стандартам?
Нужно чтобы в результате не появлялись одинаковые записи с kv.id.
Кажется нужно в GROUP BY перечислить все столбцы в SELECT, но их там очень много, запрос вида SELECT * FROM.
Ответ: left join убрать.
Вопрос: Клиентская транзакция и обработка ошибок внутри хранимой процедуры

Доброго времени суток.
Возникла такая проблема: некую ХП нужно выполнить на нескольких не связанных друг с другом серверах, при наличии ошибки выполнения на одном из серверов откатить выполнение ХП на всех, где ХП ранее была выполнена успешно - исходя из этого требования, транзакции могут быть только клиентскими; приложение выступает как координатор транзакций. Далее, весь T-SQL-ный код в ХП заключен в begin try/end try/begin catch/end catch, т.к. ХП может выбрасывать ошибки бизнес-логики (через raiserror с serverity=16), а такие ошибки без begin try не прерывают исполнение T-SQL кода. И всё бы ничего - само приложение нормально ловит ошибки, но в тексте сообщения постоянно фигурирует Uncommitable transaction detected at the end of batch - что, в общем-то, понятно, я транзакцию, которая находится в uncommitable state, выпускаю за пределы батча (ХП), а это отдельная ошибка. Если я откатываю транзакцию (с проверкой xact_state) внутри ХП, то вылетает вот такое:

Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing.
Previous count = 1, current count = 0.

что, в общем-то, тоже понятно, почему. В результате, чтобы получить ошибку, из-за которой T-SQL код сваливается в catch-блок, я сделал так (в упрощенном виде):
alter procedure tmp.up_test
as
begin
  set xact_abort on;
  begin try
    raiserror('test', 16, 0);
    insert into tmp.test values(0);
    insert into tmp.test values(0);
  end try
  begin catch
    if xact_state() in (-1, 1)
    begin
      rollback;
      begin tran; -- dummy transaction
    end;
    declare @err_msg varchar(2000);
    set @err_msg=dbo.uf_ErrMsg();
    raiserror(@err_msg, 16, 1);
  end catch
end;

(таблица tmp.test вот такая:
create table tmp.test (n int not null primary key);

)
+ клиентский код (тоже в упрощенном виде):
static void Main(string[] args)
{
  using (var cnn = new SqlConnection("Data Source=.;Initial Catalog=test;Integrated Security=True"))
  {
    cnn.Open();
    using (var tran = cnn.BeginTransaction())
    using(var cmd = new SqlCommand("tmp.up_test", cnn, tran){CommandType =  CommandType.StoredProcedure})
    {
      try
      {
        cmd.ExecuteNonQuery();
        Console.WriteLine("commiting...");
        tran.Commit();
      }
      catch(Exception e)
      {
        Console.WriteLine("rolling back...");
        tran.Rollback();
        Console.WriteLine(e.Message);
      }
    }
  }
}

что во всем в это не устраивает - во-первых, тем, что откатом транзакции на сервере, где появилась ошибка, занимается все-таки серверный код, а не клиентский; во-вторых, необходимость открытия той самой dummy transaction. Нет ли способа добиться, чтобы в итоге незакоммиченная uncommitable transaction всё же добиралась до клиентского кода?
Сервера, на которых выполняется ХП - 2005-й и 2008-й R2, поэтому при написании ХП ориентировался на возможности 2005-го.
Ответ: alexeyvg,

точно, пропустил мелкий шрифт...
Вопрос: Ошибки в выводе

Переход на версию ПХП выше. Начал ловить ошибки:
1)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by Date desc' at line 1
2)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
3)
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and type_user like 'komp' order by uni_subscribe_base.added desc' at line 1

--------------
Program Version
Apache: 2.2.31
MySQL 5.5.42-37.1
phpMyAdmin4.3.8
PHP: 5.4.45
Ответ: Отрезок кода по выводу вакансий
PHPHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
<h1>Управление вакансиями</h1>
                         <div id="bar_ubravleniya">
  <a href="<?=build_link(1297)?>" class="upr_add">Добавить вакансию</a>  
                      <a class="upr_edit" style="cursor:pointer;">Редактировать</a>
                      <!--    <a href="" class="upr_change_reyt"><span>Изменить рейтинг</span></a> -->
 
                          <a class="stop_publ" style="cursor:pointer;">Остановить публикацию</a>
                     <!--     <a href="" class="upr_histor_change"><span>История изменений</span></a>  -->
                          <a class="upr_del" style="cursor:pointer;">Удалить</a>
                         <div class="clear"></div>
                       </div> 
                    <form action="" method="post" name="">
<?=isset($_SESSION[add_vakan_ok])?"<p style='padding:10px 0 5px 0;margin:0; font:bold 15px Arial; color:green;text-align:center;'>$_SESSION[add_vakan_ok]</p>":"";?>  
<? unset($_SESSION[add_vakan_ok]);?>
                        <table cellpadding="0" cellspacing="0" border="0">
                           <thead>
 
                            <tr>
                                <td class="widt_20">      <input type="checkbox" onClick="checkAll(this.form,'element[]',this.checked)" name="categ_all"  /></td>
                                <td>Статус </td>
                                <td>Вакансия и код</td>
                                <td>Город </td>
                                <td class="widt_70"> Просмотров</td>
                <td style="text-align:right;"> <img src="/shared/site/images/load.gif" id="load_mail_rezume"></td>                           
 </tr>
                          </thead>
                          <tbody id="cont" class="cou">
<?
$tm = time(); 
$sql_rezume = BD::query("select id,Date,Speciality,Date_duration,region.title as title, hit_count from vakansii left join region on vakansii.City_ID = region.id_city where Users_site_ID = $_SESSION[id_us] order by Date desc ");
$i=0;
while($rezum = mysql_fetch_array($sql_rezume)){
$i++;
?>
                            <tr>
                                <td class="widt_20">      <input type="checkbox"  name='element[]' value="<?=$rezum[id]?>" /></td>
                                <td style="width:100px">
<?
                                            if($tm<$rezum[Date_duration]){
                                        echo "Размещено<br />".date("d.m.Y",$rezum[Date]);
                        }else{ 
                        echo "Снята с публикации<br />".date("d.m.Y",$rezum[Date_duration]);
                        }
?>
                                </td>
 
                                <td>
                                    <a href="<?=build_link(2085)?>?id_vakan=<?=$rezum[id]?>"><?=str_replace(",",", ",sh($rezum[Speciality]))?></a><br />
                                    id вакансии <?=$rezum[id]?>
                                </td>
                                <td><?=$rezum[title]?></td>
                                <td style="text-align:center"><?=$rezum[hit_count]?></td>
                <td style="text-align:center;">
<a href="<?=build_link(2197)?>?id_vakan=<?=$rezum[id]?>"><img src="/shared/site/images/edit_03.gif" title="Редактировать" ></a> 
 
 
<?
if($tm>$rezum[Date_duration]){
?>
    <img src="/shared/site/images/ok.png" style="cursor:pointer;" cus="<?=$rezum[id]?>" class="publi" title="Опубликовать"> 
<?
}else{
?>
    <img src="/shared/site/images/stop_03.gif" style="cursor:pointer;" cus="<?=$rezum[id]?>" class="stop_publi" title="Остановить публикацию"> 
<?
}
?>
 
 
 
 
 <img src="/shared/site/images/del_03.gif"  class="del_vakan" title="Удалить" cus="<?=$rezum[id]?>" style="cursor:pointer;"></td>
                          </tr>
  <? }    
  if($i==0){
    echo "<tr class='baner_center'><td colspan='5' style='text-align:center; padding:30px 0;'> Нет  вакансий  </td></tr>";
  } 
?>                      
                          </tbody>
                        </table>
                    
                    </form>
                   
                   </div>
                    
            <script type="text/javascript">
                 $(".upravlenie_vakansiyami tbody tr").not('.baner_center').mouseover(function(){
                     $(this).css("background","#ffffcc");
                     });
                      
                 $(".upravlenie_vakansiyami tbody tr").mouseout(function(){
                     $(this).css("background","#fff");
                     });
$(function() {
  $('table img').tooltip({ 
    track: true, 
    delay: 0, 
    showURL: false, 
    showBody: " - ", 
    fade: 250 
  });
});
 
 
$(".publi").click(function(){
 
    id = $(this).attr("cus");
    $("#load_mail_rezume").toggle(); 
 
    id_us = '<?=$_SESSION[id_us]?>';
    
     $.post(
        "/jscripts/ajax/publish_vakan.php",
         { id_rezum : id, id_user : id_us  }, 
           function(data){
          $("#load_mail_rezume").toggle(); 
                  $("#cont").html(data);
 
                }
         )
 
});
 
 
$(".upr_edit").click(function(){
   if($("[name=element[]]:checked").size()!=1){
     alert("Для редактирования нужно выбрать одну вакансию");
   }else{
     location.href='<?=build_link(2197)?>?id_vakan='+$("[name=element[]]:checked").val();
   } 
});
 
$(".stop_publ").click(function(){
  
 if($("[name=element[]]:checked").size()==0){
    alert("Выберите хотя бы одну вакансию");
  }else{
    if (window.confirm("Вы уверены что хотите остановить публикацию выбраных вакансий")) {
       str = "";
       $("[name=element[]]:checked").each(function (i) {
           str += "&id_vakan[]="+$(this).val();
       });
       location.href='<?=build_link($curr[id])?>?stop_publ=ok'+str;   
    }
  } 
});
 
$(".upr_del").click(function(){
  
 if($("[name=element[]]:checked").size()==0){
    alert("Выберите хотя бы одну вакансию");
  }else{
    if (window.confirm("Вы уверены что хотите удалить выбраные вакансии")) {
       str = "";
       $("[name=element[]]:checked").each(function (i) {
           str += "&id_vakan[]="+$(this).val();
       });
       location.href='<?=build_link($curr[id])?>?del_vakan=ok'+str;   
    }
  } 
});
 
 
 
 
    function checkAll(oForm, cbName, checked){
 
      for (var i=0; i < oForm[cbName].length; i++) oForm[cbName][i].checked = checked;
    }
 
 
$(".del_vakan").click(function(){
   id = $(this).attr("cus");
 
if (window.confirm("Вы уверены что хотите удалить  вакансию №"+id)) {
 
  
 
    $("#load_mail_rezume").toggle(); 
 
    id_us = '<?=$_SESSION[id_us]?>';
    
     $.post(
        "/jscripts/ajax/del_my_vakan.php",
         { id_rezum : id, id_user : id_us  }, 
           function(data){
          $("#load_mail_rezume").toggle(); 
                  $("#cont").html(data);
 
                }
         )
 }
});
 
$(".stop_publi").click(function(){
   id = $(this).attr("cus");
 
if (window.confirm("Вы уверены что хотите остановить публикацию своей вакансии №"+id)) {
 
    $("#load_mail_rezume").toggle(); 
 
    id_us = '<?=$_SESSION[id_us]?>';
    
     $.post(
        "/jscripts/ajax/stop_my_vakan.php",
         { id_rezum : id, id_user : id_us  }, 
           function(data){
          $("#load_mail_rezume").toggle(); 
                  $("#cont").html(data);
 
                }
         )
 }
});
 
            </script>   
 
            </div><!-- #content-->
 
        </div><!-- #container-->
 
        <div class="sidebar" id="sideLeft">
            <a href='<?=build_link(1033)?>' class='logo'></a>
      
           <div class="menu_left">
<?
$sql_menu_profayl_komp = BD::query("select id,headline from uni_stories where parent_id = 2094 and id!=2486 and id!=2487 and published<>0 order by priority desc");
while($profayl_menu = mysql_fetch_array($sql_menu_profayl_komp)){
 
if($profayl_menu[id]==2105 && isset($_SESSION[id_us])){
 $count_vakan = BD::query("select count(*) as cn from vakansii where Users_site_ID = $_SESSION[id_us] ");
 $coun  = mysql_fetch_assoc($count_vakan);
 $count_vakan = " ($coun[cn])";
}elseif($profayl_menu[id]==2162 && isset($_SESSION[id_us])){
 
 $count_vakan = BD::query("SELECT count(*) as cn FROM `izbranoe_rezume` left join rezume on rezume.id = izbranoe_rezume.id_rezume WHERE izbranoe_rezume.id_user = $_SESSION[id_us] and rezume.id is not null");
//echo "SELECT count(*) FROM `izbranoe_rezume` left join rezume on rezume.id = izbranoe_rezume.id_rezume WHERE izbranoe_rezume.id_user = $_SESSION[id_us] and rezume.id is not null"; 
 $coun  = mysql_fetch_assoc($count_vakan);
 $count_vakan = " ($coun[cn])";
}
elseif($profayl_menu[id]==2163 && isset($_SESSION[id_us])){
 $count_vakan = BD::query("select count(*) as cn from  uni_subscribe_base where id_user = $_SESSION[id_us] and type_user like 'komp'  ");
 $coun  = mysql_fetch_assoc($count_vakan);
 $count_vakan = " ($coun[cn])";
}
?>
 
    <p><a href="<?=build_link($profayl_menu[id])?>" <?=$curr[id]==$profayl_menu[id] || $curr[parent_id]==$profayl_menu[id]?" class='act_menu'":""?>><?=$profayl_menu[headline]."".$count_vakan;?> </a></p>
<? } ?>
 
</div>
Вопрос: Модель для мини молочного завода посоветуйте где что убрать..

Привет всем
Есть мини молочный цех . У них стоит 1С производства но они почему то не хотят его использовать хотя на нем все функционал есть..

По этому заказали программу мини учет их продуктов.. Основное главный материал у них молока
Пример
Покупает молоко у разных частных фермеров допустим в день 1000 литр в день. Потом из молока делает Твороги,Брынзы,Сметана,Кефир итд.. Асортимент где то 30 наименование

Продукты разные
Творог (весовый) 10 кг
Творой штучный 300 гр
Кефир 1 литр 1 шт
Сметана 200гр 1 шт

Что бы получить 20 кг творога понадобиться 100 литр молока...
Что бы получить Сметана 200гр понадобиться 0,200 литр молока...

Учет идет так как они мне сказали
Поступает молока для каждого продукта указывает сколько уходит молока итд
Готовый продукция оприходует склад (Название фирмы)
Потом готовую продукцию продает Откуда (Из фирмы) куда (Покупатель) итд
Иногда покупатели делают возврат товара (причина брак или просрочен если за реализацию брали)
при возврате я добавил состояние товар нормал,брак,просрочен если нормалний плюсую склад..

Посоветуйте правильно ли создал структуру

Создал для теста 4 таблицу пока без справочника контрагентов
--DROP TABLE DOC;

CREATE TABLE DOC (
  DOCID    INTEGER NOT NULL,
  FROMID   INTEGER,
  TOID     INTEGER,
  DOCDATE  DATE,
  DOCNUM   VARCHAR(20),
  DOCTYPE  SMALLINT,
  /* Keys */
  PRIMARY KEY (DOCID)
);

CREATE INDEX DOC_INDEX01
  ON DOC
  (DOCDATE, DOCID);

COMMENT ON COLUMN DOC.DOCID
  IS 'ИД документ';

COMMENT ON COLUMN DOC.FROMID
  IS 'Откуда';

COMMENT ON COLUMN DOC.TOID
  IS 'Куда';

COMMENT ON COLUMN DOC.DOCDATE
  IS 'Дата документа';

COMMENT ON COLUMN DOC.DOCNUM
  IS 'Док номер';

COMMENT ON COLUMN DOC.DOCTYPE
  IS '1 - Постуление (молоко)
2 - Продажа  (Готовых продуктов. и молока тоже)
3 - Возврат от покупателей ( Если не испорченный то в склад если испорченный то склад не добавим )
4 - Поступление готовых продуктов из производства ( то есть прибавляем склад )';


--Table: DOCITEMS

--DROP TABLE DOCITEMS;

CREATE TABLE DOCITEMS (
  DOCID        INTEGER NOT NULL,
  GOODSID      INTEGER,
  GOODSQTY     INTEGER,
  GOODSPRICE   VARCHAR(20),
  GOODSSTATE   SMALLINT,
  GOODSMSRMNT  INTEGER
);

CREATE UNIQUE INDEX DOCITEMS_INDEX01
  ON DOCITEMS
  (DOCID, GOODSID);

COMMENT ON COLUMN DOCITEMS.DOCID
  IS 'Мастер ИД';

COMMENT ON COLUMN DOCITEMS.GOODSID
  IS 'Ид товара';

COMMENT ON COLUMN DOCITEMS.GOODSQTY
  IS 'Количество';

COMMENT ON COLUMN DOCITEMS.GOODSPRICE
  IS 'Цена продажи';

COMMENT ON COLUMN DOCITEMS.GOODSSTATE
  IS 'Состояние товара';

COMMENT ON COLUMN DOCITEMS.GOODSMSRMNT
  IS 'Ед изм';

--Table: GOODS

--DROP TABLE GOODS;

CREATE TABLE GOODS (
  GOODSID        INTEGER NOT NULL,
  GOODSNAME      VARCHAR(20),
  GOODSPRICE     DECIMAL,
  GOODS_COST     DECIMAL,
  GOODSMSRMNT    INTEGER NOT NULL,
  GOODSTYPE      SMALLINT,
  GOODS_GOODSID  INTEGER NOT NULL,
  GOODS_OUT      DECIMAL,
  GOODS_IN       DECIMAL(9,3),
  /* Keys */
  PRIMARY KEY (GOODSID)
);

COMMENT ON COLUMN GOODS.GOODSID
  IS 'Ид Товара';

COMMENT ON COLUMN GOODS.GOODSNAME
  IS 'Название товара
';

COMMENT ON COLUMN GOODS.GOODSPRICE
  IS 'Цена продажи по умолчание';

COMMENT ON COLUMN GOODS.GOODS_COST
  IS 'Себестоимость товара';

COMMENT ON COLUMN GOODS.GOODSMSRMNT
  IS 'Ед измерение';

COMMENT ON COLUMN GOODS.GOODSTYPE
  IS '1- 0 Продукт или товар для продукта';

COMMENT ON COLUMN GOODS.GOODS_GOODSID
  IS 'ИД товара для продукта пример (молока)';

COMMENT ON COLUMN GOODS.GOODS_IN
  IS 'Сколько товар уходит на один продукт';

--Table: MSTMNT

--DROP TABLE MSTMNT;

CREATE TABLE MSTMNT (
  ID    INTEGER,
  NAME  VARCHAR(20) CHARACTER SET NONE
);


Для получение остатков создал
2 представление
--View: PRODUCTSHISTORY

--DROP VIEW PRODUCTSHISTORY;

CREATE VIEW PRODUCTSHISTORY
(
  DOCTYPE,
  DOCDATE,
  GOODSID,
  GOODSQTY
)
AS
select doc.DOCTYPE,doc.DOCDATE,docitems.GOODSID,docitems.GOODSQTY from docitems
  join doc on docitems.DOCID = doc.DOCID
   and doc.DOCTYPE=1
  join goods on docitems.GOODSID = goods.GOODSID
   and goods.GOODSTYPE = 0   
union 
select doc.DOCTYPE,doc.DOCDATE,docitems.GOODSID,-docitems.GOODSQTY from docitems
  join doc on docitems.DOCID = doc.DOCID
   and doc.DOCTYPE=2
  join goods on docitems.GOODSID = goods.GOODSID
union  
select doc.DOCTYPE,doc.DOCDATE,docitems.GOODSID,docitems.GOODSQTY from docitems
  join doc on docitems.DOCID = doc.DOCID
   and doc.DOCTYPE=3
   and docitems.GOODSSTATE=0
  join goods on docitems.GOODSID = goods.GOODSID
union
select doc.DOCTYPE,doc.DOCDATE,docitems.GOODSID,docitems.GOODSQTY from docitems
  join doc on docitems.DOCID = doc.DOCID
   and doc.DOCTYPE=4
  join goods on docitems.GOODSID = goods.GOODSID
   and goods.GOODSTYPE = 1   
union
select doc.DOCTYPE,doc.DOCDATE,goods.GOODS_GOODSID as GOODSID,-(docitems.GOODSQTY*goods.GOODS_OUT*goods.GOODS_IN) as GOODSQTY from docitems
  join doc on docitems.DOCID = doc.DOCID
   and doc.DOCTYPE=4
  join goods on docitems.GOODSID = goods.GOODSID
   and goods.GOODSTYPE = 1;


--View: WAREHOUSE

--DROP VIEW WAREHOUSE;

CREATE VIEW WAREHOUSE
(
  GOODSID,
  GOODSQTY
)
AS
SELECT GOODSID, SUM(GOODSQTY) GOODSQTY FROM ProductsHistory GROUP 
Ответ: 4 таблицы... Ну как тут не поёрничать ?
Вопрос: Как обойти ошибку при update?

Всем привет! Есть определенная форма в которую пользователь загружает эксель, в результате создается временная таблица Temp_table (PriceID, Qty, Price) и нажимает обновить прайс.

Запрос на SQL:
if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price') 
update p set price = t.price  from price p
join Temp_table t on p.PriceID = t.PriceID

if exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Qty') 
update p set Qty= t.Qty  from price p
join Temp_table t on p.PriceID = t.PriceID


Тут все пройдет нормально, но если пользователь создаст временную таблицу Temp_table (PriceID,Price) или Temp_table (PriceID,Qty) то это приводит к ошибке:
Недопустимое имя столбца "Price".
или
Недопустимое имя столбца "Qty".
Сам запрос SQL не выполняет, все зарубает на стадии проверки.

Можно обойти добавив перед запросом:
if not exists (select 1 from sys.all_columns where object_id = OBJECT_ID('Temp_table') and  name = 'Price')  
begin 
  ALTER TABLE Temp_table  
  ADD Price money 
end 


Но это усложняет код. Усложнять работу пользователю чтобы он пользовался строго определенной формой тоже не вариант.
Есть способ правильно обойти проверку?
Ответ:
fumitox
создается временная таблица Temp_table (PriceID, Qty, Price)

но если пользователь создаст временную таблицу Temp_table (PriceID,Price) или Temp_table (PriceID,Qty) то это приводит к ошибке

Есть способ правильно обойти проверку?


Не понял. Это нормально, что подразумевается, что должно обновиться два столбца, а пользователь отправляет только один?
Если нормально, то поставьте пользователю в "форму" галку, и пусть он выбирает, что он конкретно отправляет.

Но по сути вы пишете: Есть способ правильно обойти ошибку запроса? И ответ тут очевиден. Ошибки не "обходятся", а исправляются.
А вообще надо как минимум проверять данные приходящие от пользователя. А если у вас там в Price или Qty строка записана?
Вопрос: Успешно в плане обслуживания, но ошибка в джобе

Добрый день, коллеги !!!
автор
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4319.0 (X64) Jun 17 2014 18:50:01 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Давно не случалось у меня ничего из разряда мистики, но вот теперь не пойму в чём дело. Суть в чём, журнал плана обслуживания показывает успешное выполнение задания, а вот соответствующий ему джоб выдаёт ошибку. Подробностей нигде не могу увидеть, ни в журнале джоба и его шагов, ни в журнале ms sql и его агента, ни в логах windows.

З.Ы.: в якобы невыполненном шаге сказано следующие.
журнал задания на шаге
Сообщение:
Программа выполнения пакетов Microsoft (R) SQL Server
Version 10.50.4319.0 for 64-bit
(C) Корпорация Майкрософт (Microsoft Corporation), 2010. Все права защищены.

Начало: 21:30:00
DTExec: завершено исполнение пакетаDTSER_FAILURE (1).
Начало: 21:30:00
Готово: 2:41:47
Прошло:18707.2 секунд


З.З.Ы: что уже было сделано и не помогло:
1) Полностью переделал план обслуживания, создал новый, как раз искомый temp, ошибка не исчезла.
2) Ребут сервера не помог.
3) Проверил сугубо ETL-пакет в SSIS запуском через параметр "проверить пакет без выполнения", ошибок не выдаёт.

К сообщению приложен файл. Размер - 140Kb
Ответ: [РЕШЕНО] Боролся и так и эдак, в итоге понял что данный глюк характерен для планов обслуживания с множеством вложенных планов. Как только пересоздал отдельные планы обслуживания с единственными вложенными планами, ошибка джоба возникать перестала.
Вопрос: Возможно ли проименовать джобы?

Для работы с СУБД Oracle использую PL SQL Developer.
В его интерфейсе создаю джоб.
Всё хорошо, но Oracle выдаёт номер джоба, используя какой то внутренний счётчик. Когда джобов много, то сориентироваться в них по номерам не очень просто, а возможно ли как то задавать наименования джобам?
Ответ:
verter
FROM DBA_
Ошибка. Пишет - мол мой джоб - не джоб.
Ты ещё как-нибудь потыкайся. Метод тыка - это такой замечательный способ убития времени.