Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Алексей_новичок Member Откуда: Сообщений: 11 |
Всем привет! Недавно тут совсем, да и базами недавно тока занимаюсь. По воле судьбы пришлось админить БД в вузе. Еще тока разбираюсь, но есть один косяк в базе. В общем суть: Имеется таблица (U_Apassports), в одном поле которой (NMB)забиты серия и номер документа, а в другом поле (SER) пусто. Нужно перекинуть первые 5 символов из NMB в SER, но только для тех записей у которых в поле SYSCODE имеется значение 3000. Поддержка прислала в помощь такой запрос - Update U_APassports Where 3000=U_APassports.SYSCODE set U_APassports.SER:=SubStr(U_APassports.NMB,1,2), U_APassports.NMB:=SubStr(U_APassports.NMB,3,20); не могу понять, как в итоге должен выглядеть sql-запрос.. |
29 май 13, 12:11 [14363923] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
У вас точно Microsoft SQLServer ? Потому что поддержка вам прислала именно sql-запрос. |
||
29 май 13, 12:14 [14363952] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Система написана на Atlantis, наверно это на этом языке так выглядит запрос. Но я хочу через MS SQL-server managment (2008 r2 ) выполнить запрос. пробую такой: SELECT 1 UPDATE V$U_APassports 2 SET SER = LEFT(NMB, 5), 3 NMB = RIGHT(NMB, LEN(NMB) - 5) 4 WHERE SYSCODE = 3000 ругается "Сообщение 102, уровень 15, состояние 1, строка 2 Неправильный синтаксис около конструкции "1". Сообщение 102, уровень 15, состояние 1, строка 4 Неправильный синтаксис около конструкции "2"." |
||||
30 май 13, 13:34 [14369826] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Алексей_новичок, В запросах T-SQL не нужно нумеровать строки. |
30 май 13, 13:35 [14369831] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
http://msdn.microsoft.com/en-us/library/ms177523(v=sql.105).aspx |
||
30 май 13, 13:36 [14369834] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Алексей_новичок, Что там SELECT делает? 1 - это что за команда такая? |
30 май 13, 13:36 [14369838] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
сорри, пока еще не шарю совсем..((( |
||
30 май 13, 13:46 [14369919] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Алексей_новичок, Так, может, лучше выполнять инструкции техподдержки? Кто будет отвечать, если вы вдруг испортите данные? |
30 май 13, 14:03 [14370098] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Гость333, резервную копию сделал, если что, откачу.. |
30 май 13, 14:14 [14370175] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Алексей_новичок, UPDATE T$U_APASSPORTS SET F$SER = SUBSTRING(F$NMB, 1, 5) WHERE F$SYSCODE = 3000 Сообщение 4701, уровень 16, состояние 1, процедура T$U_APASSPORTS_U, строка 35 Не удалось найти объект "#xx$locks", так как он не существует, или отсутствуют разрешения. помогите расшифровать) |
30 май 13, 14:19 [14370244] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
|
||
30 май 13, 14:23 [14370283] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Алексей_новичок, На таблице есть триггер T$U_APASSPORTS_U, он срабатывает и выдаёт ошибку. |
30 май 13, 14:24 [14370287] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Гость333, и что посоветуете предпринять? |
30 май 13, 14:26 [14370309] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Алексей_новичок, Смотреть текст триггера и разбираться в причинах возникновения ошибки. |
30 май 13, 14:27 [14370326] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Гость333, первая строчка про триггер - ее смотреть? create trigger T$U_APASSPORTS_U on T$U_APASSPORTS after Update as declare @rowCount int; select @rowCount = @@RowCount; if @RowCount = 0 return -- Return if no rows declare @db_name varchar(30), @OpFlags int; exec @OpFlags = master..na_getflagsfast @@SPI |
30 май 13, 14:49 [14370518] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Сообщение 4701, уровень 16, состояние 1, процедура T$U_APASSPORTS_U, строка 35 |
||
30 май 13, 14:50 [14370536] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
И вы уверены, что такое изменение в обход штатных способов системы, не приведет печальным последствиям для этой самой системы ? |
30 май 13, 14:52 [14370555] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Glory, Вообще не очень. Система видимо настроена так, чтобы либо трудно вносить изменения в таблицы через MS SQL-srv, либо тока через встроенное средство самой системы (support). Наверно лучше в нем пробовать запрос. |
30 май 13, 15:05 [14370675] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Алексей_новичок, В общем выполнил запрос в штатном средстве системы такого вида Update U_APassports Where 3000=U_APassports.SYSCODE set U_APassports.SER:=SubStr(U_APassports.NMB,1,2), U_APassports.NMB:=SubStr(U_APassports.NMB,3,20); Но получилось следующее - 2 знака перетянулось в поле SER, и в тех записях у которых поле было уже заполнено верно. и информация обновилась в нем на неверную. Получается нужно задать условие, чтобы запрос выполнялся при условии, что поле SER пустое. Как бы это могло выглядеть? |
30 май 13, 15:41 [14371009] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Как еще одно условие в Where |
||
30 май 13, 15:43 [14371020] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Glory, тогда должно выглядеть так Where <4 любые знака>=U_APassports.NMB НО как обозначить <4 любые знака>? |
30 май 13, 16:00 [14371151] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Вы наверное хотели сказать размер значения в поле U_APassports.NMB должен быть 4 символа ? |
||
30 май 13, 16:04 [14371195] Ответить | Цитировать Сообщить модератору |
Алексей_новичок Member Откуда: Сообщений: 11 |
Glory, Не, наврал я. Вообще условие про поле SER надо. Т.е. если в поле SER пусто, то выполнять запрос, а если есть любые 4 символа, то не выполнять. Проще наверно задать условие, что если поле SER пустое. Это обозначается как NULL? |
30 май 13, 16:11 [14371245] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
А если есть 5 символов ? |
||
30 май 13, 16:12 [14371251] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
Это надо смотреть, как ваша система записывает пустые значения в SER. Может, как NULL, а может, как пустую строку. И дальше либо смотреть документацию по системе, либо снова трясти техподдержку, чтобы помогли составить запрос на местном диалекте SQL. |
||
30 май 13, 16:21 [14371319] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |