|
Как в sql базе найти нужную запись только по ошибке отпочкования РИБ? | ☑ | ||
---|---|---|---|---|
0
Обработка
25.08.21
✎
12:09
|
Есть база Розница в скуле объем 96 ГБ
При отпочковании примерно 32 млн записей регистрируются. И на 40% процесса отпочкования вываливается ошибка. Ошибка в значении типа 'Дата' Не удалось создать начальный образ по причине: Ошибка в значении типа "дата" Дата '23.09.1190 0:00:00' не может быть записана в базу данных на MS SQL Server с нулевым смещением дат |
|||
1
Обработка
25.08.21
✎
12:12
|
Есть ли возможность прямо в скуле искать эту траблу?
|
|||
2
Ёпрст
25.08.21
✎
12:13
|
(1) яя, натюрлих.
select date from table where date = .... |
|||
3
Обработка
25.08.21
✎
12:15
|
Я наверно при отпочковании забыл смещение установить 2000.
Но ведь дата видимо такая в реале 23.09.2119 0:00:00' |
|||
4
Обработка
25.08.21
✎
12:15
|
Все равно искать и убрать к черту надо.
|
|||
5
BeerHelpsMeWin
25.08.21
✎
12:17
|
Кто-то уверенно ввел док 2119 годом вместо 2019?
|
|||
6
Обработка
25.08.21
✎
12:22
|
Было бы круто написать в скуле запрос поиск по полем типа дата значение равное больше определенного или на конкретное значение...
Но я особо не умею. |
|||
7
youalex
25.08.21
✎
13:41
|
как то так можно, если по конкретному полю _Date_Time
declare tabname nvarchar(150) declare t table (tabname nvarchar(150)) declare res table (tabname nvarchar(150), _Number nvarchar(150), _Date_Time datetime2(0)) insert into t (tabname) select DISTINCT TOP 77 c.TABLE_NAME from INFORMATION_SCHEMA.COLUMNS c where c.COLUMN_NAME = '_Date_Time' SET tabname = (SELECT TOP 1 tabname from t) WHILE tabname IS NOT NULL BEGIN insert into res (tabname, _Number, _Date_Time) EXEC ('select top 77 ''' + tabname + ''' tabname, _Number, _Date_Time from ' + tabname + ' where _Date_Time >= ''4021-12-01'' ') DELETE FROM t WHERE tabname = tabname SET tabname = (SELECT TOP 1 tabname from t) END select * from res |
|||
8
youalex
25.08.21
✎
13:42
|
(7) движок сайта заменяет амперсанды на болд)
res |
|||
9
Обработка
25.08.21
✎
14:14
|
(7) (8) Спасибо но ничего не понятно. ))
|
|||
10
youalex
25.08.21
✎
14:19
|
(9) в этом скрипте у переменных скуля tabname, res, t - должны быть амперсанды в начале
where _Date_Time >= ''4021-12-01'' - здесь условие по дате top 77 - можно убрать |
|||
11
youalex
25.08.21
✎
14:50
|
(10) т.е не амперсанд, а собачка "@"
https://savetext.ru/fDEjFBxG |
|||
12
Ёпрст
25.08.21
✎
16:10
|
(7) дык.. 77, не мало ?
|
|||
13
Ёпрст
25.08.21
✎
16:11
|
табличек жешь и больше могёт быть
+ и..тут может вообще все реквизиты с типом дата лучше проверить ? |
|||
14
youalex
25.08.21
✎
16:11
|
(12) норм, мне хватило)
|
|||
15
Обработка
26.08.21
✎
06:33
|
Ошибка вылетело
Msg 207, Level 16, State 1, Line 2 Недопустимое имя столбца "_Number". |
|||
16
Обработка
26.08.21
✎
06:33
|
Вот:
declare tabname nvarchar(150) declare t table (tabname nvarchar(150)) declare res table (tabname nvarchar(150), _Number nvarchar(150), _Date_Time datetime2(0)) insert into t (tabname) select DISTINCT TOP 77 c.TABLE_NAME from INFORMATION_SCHEMA.COLUMNS c where c.COLUMN_NAME = '_Date_Time' SET tabname = (SELECT TOP 1 tabname from t) WHILE tabname IS NOT NULL BEGIN insert into res (tabname, _Number, _Date_Time) EXEC ('select top 100''' + tabname + ''' tabname, _Number, _Date_Time from ' + tabname + ' where _Date_Time >= ''2118-12-01'' ') DELETE FROM t WHERE tabname = tabname SET tabname = (SELECT TOP 1 tabname from t) END select * from res |
|||
17
youalex
26.08.21
✎
08:44
|
(16) вот этот должен искать по идее по всем полям (на тяжелых базах будет долго, т.к. запрос по каждому сочетанию таблица/колонка с типом дата)
https://savetext.ru/VDtUk5ag |
|||
18
Обработка
26.08.21
✎
09:08
|
(17) Перевел с русского
получилось так |
|||
19
Обработка
26.08.21
✎
09:08
|
declare tabname nvarchar ( 150 )
declare @colname nvarchar ( 150 ) declare table t (tabname nvarchar ( 150 ) , tabname nvarchar ( 150 ) ) declare @query nvarchar ( max ) declare table res (tabname nvarchar ( 150 ) , tabname nvarchar ( 150 ) , value datetime2 ) set NOCOUNT on insert into t (tabname, datetime2 ) select DISTINCT c.TABLE_NAME, c.COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS c where c.DATA_TYPE in ( 'datetime' , 'datetime2' ) select TOP 1 tabname = tabname, @colname = colname из t WHILE @colname IS NOT NULL BEGIN PRINT CONCAT ( tabname, '.' , @Colname ) set @query = 'select top 1' 'tabname' 'tabname,' '@colname' 'colname, @colname value из tabname, где @colname> = ' ' 4300-12-01 ' ' ' SET @query = replace ( @query, 'tabname' , tabname ) SET @query = replace ( @query, '@colname' , @colname ) insert intro res (tabname, _Number, _Date_Time) EXEC ( @ запрос ) Delete from t, WHERE tabname = tabname и colname = @colname SET @colname = null SELECT TOP 1 tabname = tabname, @colname = colname из t END select * from res |
|||
20
Обработка
26.08.21
✎
09:09
|
По ходу ошибки:
Msg 156, Level 15, State 1, Line 3 Неправильный синтаксис около ключевого слова "table". Msg 156, Level 15, State 1, Line 5 Неправильный синтаксис около ключевого слова "table". Msg 1087, Level 15, State 2, Line 9 Необходимо объявить табличную переменную "@t". Msg 102, Level 15, State 1, Line 13 Неправильный синтаксис около конструкции "из". Msg 102, Level 15, State 1, Line 21 Неправильный синтаксис около конструкции "@tabname". Msg 102, Level 15, State 1, Line 27 Неправильный синтаксис около конструкции "@res". Msg 137, Level 15, State 2, Line 28 Необходимо объявить скалярную переменную "@". Msg 1087, Level 15, State 2, Line 30 Необходимо объявить табличную переменную "@t". Msg 102, Level 15, State 1, Line 33 Неправильный синтаксис около конструкции "из". Msg 1087, Level 15, State 2, Line 36 Необходимо объявить табличную переменную "@res". |
|||
21
youalex
26.08.21
✎
09:12
|
(18) >Перевел с русского
Не понял, где там русский, это скрипт tsql |
|||
22
acanta
26.08.21
✎
09:16
|
Если это 7ка, то можно обойти, мд-шник заготовить без регистрации или с регистрацией только справочники, создать периферийную базу, затем заменить на мд-шник с обычной регистрацией и зарегистрировать нужные документы программно записать(), можно даже остатки с какого-то числа и первичку с какого-то числа. Глючный документ в периферийную не пойдет.
|
|||
23
youalex
26.08.21
✎
09:19
|
||||
24
Обработка
26.08.21
✎
09:25
|
(21) Ой пардон у меня браузер автоматом переводил оказывается. )))
|
|||
25
Обработка
26.08.21
✎
09:33
|
(21)(23) Спасибо запрос сработал. Но увы вывел кучу данных не понятнго.Там смещение дат не даст мне найти видимо надо в 1С искать
Вот _AccumRg6494 _Period 4015-11-12 00:00:00.0000000 _AccumRg6503 _Period 4018-09-20 18:02:26.0000000 _AccumRg6536 _Period 4016-07-14 21:21:11.0000000 _AccumRg6557 _Period 4016-07-14 21:21:11.0000000 _AccumRg6602 _Period 4016-07-14 21:21:11.0000000 _AccumRg6620 _Period 4018-07-25 18:10:03.0000000 _AccumRg6640 _Period 4016-03-14 16:27:12.0000000 _AccumRg6655 _Period 4015-11-12 00:00:00.0000000 _AccumRg6697 _Period 4019-08-20 18:17:54.0000000 _AccumRg6731 _Period 4019-08-01 15:58:19.0000000 _AccumRg6747 _Period 4019-08-13 10:00:02.0000000 _AccumRg6768 _Period 4015-11-12 00:00:00.0000000 _AccumRg6865 _Fld7276 4015-12-24 20:06:38.0000000 |
|||
26
Обработка
26.08.21
✎
09:42
|
Перебил дату именно как у вас. Получилось такое
........... .............. _AccumRgT7835 _Period 5999-11-01 00:00:00.0000000 _AccumRgT8714 _Period 5999-11-01 00:00:00.0000000 _AccumRgT8758 _Period 5999-11-01 00:00:00.0000000 _AccumRgT9757 _Period 5999-11-01 00:00:00.0000000 _Document9570 _Fld9574 5018-02-09 00:00:00.0000000 _Document9570 _Fld9578 5085-12-04 00:00:00.0000000 _InfoRg7551 _Fld7555 4306-07-09 00:00:00.0000000 _Reference48 _Fld7581 4707-04-19 00:00:00.0000000 |
|||
27
youalex
26.08.21
✎
09:43
|
(25) datetime - С января 1753 года до 31 декабря 9999 года
т.е. по идее тебе нужно искать даты (с учетом смещения 2000) where @colname < '3753-01-01' А потом через СтруктураХраненияИнформационнойБазы() смотреть что это |
|||
28
youalex
26.08.21
✎
09:45
|
(27) или нет)
|
|||
29
Обработка
26.08.21
✎
09:50
|
(27) При таком условии вылезло 406 значений в разных таблицах.
Вот отрывок _AccumRg6494 _Period 4015-11-12 00:00:00.0000000 _AccumRg6503 _Period 4018-09-20 18:02:26.0000000 _AccumRg6536 _Period 4016-07-14 21:21:11.0000000 _AccumRg6557 _Period 4016-07-14 21:21:11.0000000 _AccumRg6602 _Period 4016-07-14 21:21:11.0000000 _AccumRg6620 _Period 4018-07-25 18:10:03.0000000 _AccumRg6640 _Period 4016-03-14 16:27:12.0000000 _AccumRg6655 _Period 4015-11-12 00:00:00.0000000 _AccumRg6697 _Period 4019-08-20 18:17:54.0000000 _AccumRg6731 _Period 4019-08-01 15:58:19.0000000 ........................ ........ _ScheduledJobs10669 _FinishTime 4021-04-01 10:00:28.0000000 _ScheduledJobs10669 _StartTime 4021-04-01 10:00:01.0000000 _Seq7118 _Period 4015-11-17 09:38:06.0000000 _SeqB7119 _Period 4021-05-31 23:59:59.0000000 _UsersWorkHistory _Date 4018-01-25 12:50:24.0000000 Config Creation 4019-09-06 15:27:01.0000000 Config Modified 4019-09-06 15:27:01.0000000 Files Creation 4016-01-29 14:33:53.0000000 Files Modified 4016-11-17 05:44:23.0000000 Params Creation 4017-03-27 16:10:36.0000000 Params Modified 4017-03-27 16:10:36.0000000 v8users Changed 4018-09-20 11:40:13.0000000 |
|||
30
youalex
26.08.21
✎
10:01
|
(29) как это? если 4018-09-20 никак не меньше 3753-01-01
тут по идее еще нужно учитывать пустые даты ,и типы где только время, навскидку будет такое условие, с учетом текущего смещения 2000 (кавычки из скрипта) where @colname between ''2001-01-02'' and ''3753-01-01'' Я у себя нашел даты рождения 11.11.0179 0:00:00 ) |
|||
31
Обработка
26.08.21
✎
10:10
|
(27) Я так и не понял почему я ищу именно в этом диапазоне
"datetime - С января 1753 года до 31 декабря 9999 года" или же ''2001-01-02'' and ''3753-01-01'' Мне же нужно найти даты больше 2100 года хотя бы. А если нарушения искать надо искать даты до 1920 года Ну не бывает дата рожение сотра до 1920 и то же не ложите в учет это все что больше 2025 года например. |
|||
32
Обработка
26.08.21
✎
10:11
|
(30) При этом выходит
_Document7861 _Fld7865 2121-02-12 00:00:00.0000000 _Document7861 _Fld7868 2019-02-21 00:00:00.0000000 _Document9570 _Fld9574 2217-10-06 00:00:00.0000000 _Document9570 _Fld9578 2200-04-19 00:00:00.0000000 _InfoRg7551 _Fld7555 2003-03-03 00:00:00.0000000 _InfoRg7752 _Fld7758 2217-01-01 00:00:00.0000000 _InfoRg7752 _Fld7759 3019-12-31 00:00:00.0000000 _Reference103 _Fld1255 3196-05-11 00:00:00.0000000 _Reference48 _Fld7581 2002-06-23 00:00:00.0000000 Но по первых двум видам дока ищу таких документов в базе нет по описанию ((( |
|||
33
Обработка
26.08.21
✎
10:14
|
Из этого списка нашел 1 регистр и 2 справочника и все.
|
|||
34
youalex
26.08.21
✎
10:16
|
(31)
Я исходил из ошибки в (0) "datetime - С января 1753 года до 31 декабря 9999 года" - это ограничение типа datetime, это то на что изначально ругалось в (0) т.е. если перекатывать из базы со смещением 2000 в базу без смещения будет этот глючным диапазон 2001-01-02- в базе со смещением это 2 января 0001 года. Т.е. это не пустая дата, и не реквизит "только время" (33) так не бывает, точно одна и та же база? |
|||
35
Обработка
26.08.21
✎
10:18
|
(34) Условие в периоде понял. на счет 33 правы случайно не ту базу таблицы глянул ))
|
|||
36
Обработка
26.08.21
✎
10:35
|
Алексей, огромное спасибо за скрипт и за разъяснения.
Для структуры таблиц и полей раздобыл в гугле обработку еще. Можно теперь всегда ковырять даты с грехами. С меня магарыч тебе. Питеру привет. Я там учился 5 лет... |
|||
37
youalex
26.08.21
✎
11:02
|
(36) да не за что, развлёкся немного)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |