Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Преобразование без усечения данных  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Доброго времени суток! Есть процедура ввода порядков номеров. Единственное что надо сделать - должны вводиться номера с нулями вначале (015 или 0020), количество нулей разное. При сложении нули теряются. Помогите найти решение!
ALTER PROCEDURE [dbo].[MultiInsert]
@min varchar(50), @max varchar(50), @lit varchar(1), @Tematika varchar(50), @Naimenovanie varchar(50), @Dec_Nomer varchar(50), @Bitbukva bit, @min1 int, @max1 int
AS
SET NOCOUNT ON;
WHILE @min1<=@max1
begin
if @Bitbukva='True'
Begin
INSERT INTO Kartochka (Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer) VALUES (@Tematika, @Naimenovanie, @min, @Dec_Nomer)
set @min=CAST(@min as varchar)+1
set @min1=@min1+1
End
ELSE
if @Bitbukva='False'
begin
INSERT INTO Kartochka (Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer) VALUES (@Tematika, @Naimenovanie, @min+@lit, @Dec_Nomer)
set @min=CAST(@min as varchar)+1
set @min1=@min1+1
end
end
6 сен 16, 08:04    [19631285]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
FOGOT-BAstA
должны вводиться номера с нулями вначале (015 или 0020), количество нулей разное. При сложении нули теряются

алгоритм добавления\ ведущих нулей - тоже надо выдумать ?
6 сен 16, 09:43    [19631487]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
FOGOT-BAstA
Есть процедура ввода порядков номеров. Единственное что надо сделать - должны вводиться номера с нулями вначале (015 или 0020)
Нужно задачу сформулировать как то, эээ, формальнее, строже.
Вспоминаю начальную школу, не помню правил работы с "нулями вначале номеров".

Наверное, это всё таки не номера, а строки?

Сложение как должно делаться?
"Сложение" 015 и 0020 чему равно?
00035?
0035?
035?
0150020?
6 сен 16, 09:53    [19631544]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
Maxx
FOGOT-BAstA
должны вводиться номера с нулями вначале (015 или 0020), количество нулей разное. При сложении нули теряются

алгоритм добавления\ ведущих нулей - тоже надо выдумать ?

параметр @min и @max передаются из делфи в виде числа с нулями (001 допустим) в строковом типе.

alexeyvg
FOGOT-BAstA
Есть процедура ввода порядков номеров. Единственное что надо сделать - должны вводиться номера с нулями вначале (015 или 0020)
Нужно задачу сформулировать как то, эээ, формальнее, строже.
Вспоминаю начальную школу, не помню правил работы с "нулями вначале номеров".

Наверное, это всё таки не номера, а строки?

Сложение как должно делаться?
"Сложение" 015 и 0020 чему равно?
00035?
0035?
035?
0150020?

Да это строки, Вы правы.
Объясню задачу - надо вводить в таблицу номера приборов. Бывает что они идут подряд десятками (допустим от 001 до 020) а могут и от 1 до 20. В таблице номер имеет строковый тип, т.к. дополнительно бывает на конце буква (т.е. получается от 001а до 020а). Значит мне надо ввести все 20 полей по порядку в таблицу. Вот тут не могу понять как и нули оставить в строке и инкремент сделать!
6 сен 16, 10:10    [19631609]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
AnSi_Sr
Member

Откуда:
Сообщений: 134
FOGOT-BAstA,

Вытащить из строки первую попавшуюся последовательность цифр с помощью регулярных выражений, преобразовать в число, увеличить на 1, добить нулями слева до длины "вытащенной" последовательности, и заменить эту "вытащенную" последовательность в исходной строке новым значением.
6 сен 16, 10:42    [19631787]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
o-o
Guest
declare @t table (i1 varchar(10), i2 varchar(10)); 
insert into @t values('001abc',  '011abc'), ('001',  '020');

select right(replicate('0', 10) + cast(a1.i1_int + a2.n as varchar(10)) + a1.i1_ch, len(i1)) as new_i
from @t cross apply ( select
       left(i1, case patindex('%[^0-9]%', i1) 
                     when 0 then len(i1)
                     else patindex('%[^0-9]%', i1) - 1
                end)  + 0 as i1_int,
       substring(i1, case patindex('%[^0-9]%', i1) 
						 when 0 then len(i1) + 1
						 else patindex('%[^0-9]%', i1)
                     end, len(i1)) as i1_ch,                
       left(i2, case patindex('%[^0-9]%', i2) 
                     when 0 then len(i2)
                     else patindex('%[^0-9]%', i2) - 1
                end)  + 0 as i2_int  
       ) a1
     cross apply (select top(a1.i2_int - a1.i1_int + 1) number as n
                  from master..spt_values 
                  where type = 'p') a2;
-----------
new_i
001abc
002abc
003abc
004abc
005abc
006abc
007abc
008abc
009abc
010abc
011abc
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020                              
6 сен 16, 11:02    [19631895]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
aleks2
Guest
FOGOT-BAstA
Объясню задачу - надо вводить в таблицу номера приборов. Бывает что они идут подряд десятками (допустим от 001 до 020) а могут и от 1 до 20. В таблице номер имеет строковый тип, т.к. дополнительно бывает на конце буква (т.е. получается от 001а до 020а). Значит мне надо ввести все 20 полей по порядку в таблицу. Вот тут не могу понять как и нули оставить в строке и инкремент сделать!


Мухи отдельно - котлеты отдельно.

Вместо @min - @max строками, передавать
1. Разрядность номера
2. @min и @max целыми числами
3. Суффикс номера.

Фсе станет тривиальным.
6 сен 16, 12:49    [19632483]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
o-o,
Спасибо огромное. То что надо. Единственное, если просто символ без букв и нулей, то от 1 до 100 кратные десяти будут отображаться как 0.
Может подскажите как правильно эти значения вставить в мою таблицу.
INSERT INTO () SELECT FROM

не получается написать верно!
6 сен 16, 13:44    [19632741]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
o-o
Guest
FOGOT-BAstA
Единственное, если просто символ без букв и нулей, то от 1 до 100 кратные десяти будут отображаться как 0.

что есть "символ без букв и нулей"?
это цифры и всякие знаки препинания и прочее?

у меня в коде ошибка в смысле длины получаемого,
надо ее брать от конечного кода (i2), а у меня от первого.
выделяю красным, где надо переправить.
а вставлять -- так и писать insert ..select
create table #tnew (cod varchar(10));

declare @t table (i1 varchar(10), i2 varchar(10)); 
insert into @t values('1!',  '25!');

insert into #tnew (cod)
select right(replicate('0', 10) + cast(a1.i1_int + a2.n as varchar(10)) + a1.i1_ch, len(i2)) as new_i
from @t cross apply ( select
       left(i1, case patindex('%[^0-9]%', i1) 
                     when 0 then len(i1)
                     else patindex('%[^0-9]%', i1) - 1
                end)  + 0 as i1_int,
       substring(i1, case patindex('%[^0-9]%', i1) 
						 when 0 then len(i1) + 1
						 else patindex('%[^0-9]%', i1)
                     end, len(i1)) as i1_ch,                
       left(i2, case patindex('%[^0-9]%', i2) 
                     when 0 then len(i2)
                     else patindex('%[^0-9]%', i2) - 1
                end)  + 0 as i2_int  
       ) a1
     cross apply (select top(a1.i2_int - a1.i1_int + 1) number as n
                  from master..spt_values 
                  where type = 'p') a2;
6 сен 16, 14:41    [19633038]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
o-o,
Не могу сообразить как с остальными значениями вставить, они не могут быть NULL. Приходят из приложения параметрами.
Ошибка в синтаксисе, не могу допереть как правильно (это один из вариантов которые пробовал).
declare @t table (i1 varchar(10), i2 varchar(10)); 
declare @Tematika varchar(50), @Naimenovanie varchar(50), @Dec_Nomer varchar(50);
insert into @t values('001',  '010');

INSERT INTO Kartochka (Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer) select @Tematika, @Naimenovanie, right(replicate('0', 10) + cast(a1.i1_int + a2.n as varchar(10)) + a1.i1_ch, len(i2)) as new_i
from @t cross apply ( select
       left(i1, case patindex('%[^0-9]%', i1) 
                     when 0 then len(i1)
                     else patindex('%[^0-9]%', i1) - 1
                end)  + 0 as i1_int,
       substring(i1, case patindex('%[^0-9]%', i1) 
						 when 0 then len(i1) + 1
						 else patindex('%[^0-9]%', i1)
                     end, len(i1)) as i1_ch,                
       left(i2, case patindex('%[^0-9]%', i2) 
                     when 0 then len(i2)
                     else patindex('%[^0-9]%', i2) - 1
                end)  + 0 as i2_int  
       ) a1
     cross apply (select top(a1.i2_int - a1.i1_int + 1) number as n
                  from master..spt_values 
                  where type = 'p') a2, @Dec_Nomer

Подчеркивает @Dec_Nomer и пишет-
Список выбора для инструкции INSERT содержит меньшее число элементов, чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.
7 сен 16, 07:14    [19635294]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
o-o
Guest
declare @t table (i1 varchar(10), i2 varchar(10)); 
declare @Tematika varchar(50), @Naimenovanie varchar(50), @Dec_Nomer varchar(50);
insert into @t values('001',  '010');

INSERT INTO Kartochka (Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer) select @Tematika, @Naimenovanie, right(replicate('0', 10) + cast(a1.i1_int + a2.n as varchar(10)) + a1.i1_ch, len(i2)) as new_i
, @Dec_Nomer
from @t cross apply ( select
       left(i1, case patindex('%[^0-9]%', i1) 
                     when 0 then len(i1)
                     else patindex('%[^0-9]%', i1) - 1
                end)  + 0 as i1_int,
       substring(i1, case patindex('%[^0-9]%', i1) 
						 when 0 then len(i1) + 1
						 else patindex('%[^0-9]%', i1)
                     end, len(i1)) as i1_ch,                
       left(i2, case patindex('%[^0-9]%', i2) 
                     when 0 then len(i2)
                     else patindex('%[^0-9]%', i2) - 1
                end)  + 0 as i2_int  
       ) a1
     cross apply (select top(a1.i2_int - a1.i1_int + 1) number as n
                  from master..spt_values 
                  where type = 'p') a2
7 сен 16, 08:07    [19635345]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
FOGOT-BAstA
Ошибка в синтаксисе, не могу допереть как правильно (это один из вариантов которые пробовал).
Просто посчитайте количество полей в SELECT (у вас их 3), и количество вставляемых полей (у вас их 4), они должны совпадать.
7 сен 16, 09:55    [19635659]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
o-o
Guest
alexeyvg
FOGOT-BAstA
Ошибка в синтаксисе, не могу допереть как правильно (это один из вариантов которые пробовал).
Просто посчитайте количество полей в SELECT (у вас их 3), и количество вставляемых полей (у вас их 4), они должны совпадать.

нет, он вставляет 4,
но написал не туда.
посмотрите внимательно его код,
последнюю строку
7 сен 16, 10:26    [19635850]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
o-o
alexeyvg
пропущено...
Просто посчитайте количество полей в SELECT (у вас их 3), и количество вставляемых полей (у вас их 4), они должны совпадать.

нет, он вставляет 4,
но написал не туда.
посмотрите внимательно его код,
последнюю строку

Ну вот я считаю:
INSERT INTO Kartochka (Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer) select @Tematika, @Naimenovanie, right(replicate('0', 10) + cast(a1.i1_int + a2.n as varchar(10)) + a1.i1_ch, len(i2)) as new_i
то есть в селекте три поля: @Tematika, @Naimenovanie и new_i
а в инсёрте 4: Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer

нужно добавить ещё одно поле, @Dec_Nomer, что вы и сделали.

А, понял, что вы имели в виду:
FOGOT-BAstA
where type = 'p') a2, @Dec_Nomer

:-)
Ну да, поля должны быть в списке полей SELECT-а, а не в произвольных местах текста запроса.
7 сен 16, 10:41    [19635937]     Ответить | Цитировать Сообщить модератору
 Re: Преобразование без усечения данных  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
o-o спасибо за помощь! Все отлично работает!
8 сен 16, 06:33    [19640213]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить