powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задать числовую последовательность для поля
12 сообщений из 12, страница 1 из 1
Задать числовую последовательность для поля
    #39925151
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день! Не могу доделать процедуру для вставки в поле заданной последовательности чисел от @min до @max.
Код: sql
1.
2.
3.
4.
5.
6.
7.
@min int, @max int, @Nomer_Protokol varchar(15), @Code int, @Date_VK date

INSERT INTO Remont1 (Act_VK, Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer, Zakazchik, Akt_Na_Issledovanie, Opisanie_VK, Nomer_Protokol2, Etap, Date_Akt_Na_Issledovanie, Date_Post, Date_Proizv, Date_VK, Nomer_Protokol)
select @Nomer_Protokol, a8.Tematika, a8.Naimenovanie, a8.Zav_Nomer, a8.Dec_Nomer, a8.Otkyda, a8.Akt_Na_Issledovanie, a8.Opisanie, @Code, a8.Etap, a8.Date_Akt_Na_Issledovanie, a8.Date_Dokument, a8.Date_Proizv, @Date_VK,
??????
FROM (SELECT Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer, Otkyda, Akt_Na_Issledovanie, a4.Opisanie, Etap, Date_Akt_Na_Issledovanie, Date_Dokument, Date_Proizv FROM VK a3 INNER JOIN Dannie_VK a4 on a3.ID_VK=a4.ID_VK WHERE a3.Nomer_Protokol=@Nomer_Protokol and a3.Date_VK=@Date_VK) a8
cross apply (SELECT TOP (@Max-@Min+1) @Min-1+row_number() over(order by t1.number) as N FROM master..spt_values t1) a5


В последнее поле Nomer_Protokol для каждой записи, где значения из соединенных таблиц VK и Dannie_VK, необходимо вставить порядковый номер из последовательности между @min и @max, которую задаёт пользователь. Пробовал и через cross apply master..spt_values и через CTE , всегда каждую запись вставляет в @max-@min раз больше...
Подскажите как реализовать правильно, чего не хватает!? Заранее спасибо.
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39925184
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA
Подскажите как реализовать правильно, чего не хватает!?
ROW_NUMBER()
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39925188
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
FOGOT-BAstA
Подскажите как реализовать правильно, чего не хватает!?
ROW_NUMBER()
А, вы там используете ROW_NUMBER, да ещё и master..spt_values...

Непонятно, что вам нужно.
Если просто нужно пронумеровать результат выборки из FROM VK a3 INNER JOIN Dannie_VK, добавьте последним полем этот ROW_NUMBER(), и всё.

PS Как вы свой код читаете, без переводов строк? Скроллите мышкой вправо-влево?
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39925200
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FOGOT-BAstA,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
DECLARE @t AS TABLE(val INT NOT NULL);
DECLARE @min INT = 1
      , @max INT = 20
      , @i   INT = 0;

SET @min-=1;

-- Тестовые данные
WHILE @i < 1000
    BEGIN
        INSERT INTO @t(val) VALUES(@i);
        SET @i+=1;
    END; 

-- Решение
SELECT TOP (@max - @min) 
       val
     , ROW_NUMBER() OVER(ORDER BY ( SELECT 1 )) + @min AS id
FROM @t;
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39925555
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg, entrypoint
Спасибо, ваши советы очень помогли))
ЗЫ:У меня всё влезает на экране 24', ничего крутить не надо.
То, что получилось
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
ALTER PROCEDURE [dbo].[MultiInsert_VK]
@min int, @max int, @Nomer_Protokol varchar(15), @Code int, @Date_VK datetime, @Error varchar(150) OUTPUT
AS
Declare @Val1 as int, @Val2 as int;
SELECT @Val1=COUNT(fff.N) FROM (SELECT TOP (@Max-@Min+1) @Min-1+row_number() over(order by t1.number) as N FROM master..spt_values t1) fff
SELECT @Val2=COUNT(b2.ID_Dannie_VK) FROM VK b1 INNER JOIN Dannie_VK b2 on b1.ID_VK=b2.ID_VK WHERE b1.Nomer_Protokol=@Nomer_Protokol and b1.Date_VK=@Date_VK

IF @Val1=@Val2
INSERT INTO Remont1 (Act_VK, Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer, Zakazchik, Akt_Na_Issledovanie, Opisanie_VK, Nomer_Protokol2, Etap, Date_Akt_Na_Issledovanie, Date_Post, Date_Proizv, Date_VK, Nomer_Protokol)
select @Nomer_Protokol, a8.Tematika, a8.Naimenovanie, a8.Zav_Nomer, a8.Dec_Nomer, a8.Otkyda, a8.Akt_Na_Issledovanie, a8.Opisanie, 
@Code, a8.Etap, a8.Date_Akt_Na_Issledovanie, a8.Date_Dokument, a8.Date_Proizv, @Date_VK, id
FROM (SELECT Tematika, Naimenovanie, Zav_Nomer, Dec_Nomer, Otkyda, Akt_Na_Issledovanie, a4.Opisanie, Etap, Date_Akt_Na_Issledovanie, Date_Dokument, Date_Proizv, 
ROW_NUMBER() OVER(ORDER BY ( SELECT 1 )) + @min-1 AS id 
FROM 
VK a3 INNER JOIN Dannie_VK a4 on a3.ID_VK=a4.ID_VK WHERE a3.Nomer_Protokol=@Nomer_Protokol and a3.Date_VK=@Date_VK) a8
ELSE
BEGIN
SET @Error='Количество актов не соответствует количеству заводских номеров' 
RETURN
END



А можно еще вопрос, не могу понять, почему на клиенте выдаёт ошибку:
"Формальный параметр @Date_VK не был объявлен как параметр OUTPUT, однако текущий параметр выдан в результате запроса"
Менял тип параметра на клиенте, результата нет, явно в процедуре вопрос. Вроде он ничего возвращать не должен...
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926012
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA
А можно еще вопрос, не могу понять, почему на клиенте выдаёт ошибку:
"Формальный параметр @Date_VK не был объявлен как параметр OUTPUT, однако текущий параметр выдан в результате запроса"
Менял тип параметра на клиенте, результата нет, явно в процедуре вопрос. Вроде он ничего возвращать не должен...
Скорее, это в вашем клиенте проблема.
Может, у него есть свои метаданные, в которых @Date_VK отмечен как возвращаемый. В частности, это могут быть метаданные, закешированные с прошлой версии процедуры.
Можно посмотреть вызов в профайлере, наверняка там будет @Date_VK OUTPUT
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926099
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,
Не имею опыта работы с профайлером, но вот что получается. Может я не те события выбрал...
Из поля TextData:

Код: sql
1.
2.
3.
4.
5.
6.
declare @p5 varchar(150)
set @p5=NULL
declare @p6 datetime
set @p6='2020-01-27 00:00:00'
exec MultiInsert_VK;1 '10','14','190/56  ','190',@p5 output,@p6 output
select @p5, @p6



Насколько я понимаю, SQL считает @p6, т.е. @Date_Vk выходным параметром? А почему и как быть?))
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926103
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA
Насколько я понимаю, SQL считает @p6, т.е. @Date_Vk выходным параметром? А почему и как быть?))
Нет, не SQL Server считает, а приложение.

Этот же запрос отправляет приложение, а не сервер. Оно могло бы отправить не "@p6 output", а, например, "@p6 матьвашу!".

А "почему" - это вам виднее, оно же у вас. Один из вариантов я озвучил, но могут быть и другие.
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926147
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,
действительно я чуть ошибся, экспериментировал и указал @Date_VK как InputOutput на клиенте, когда изменил на Input результат вроде нормальный стал
Код: sql
1.
2.
3.
4.
declare @p5 varchar(150)
set @p5=NULL
exec MultiInsert_VK;1 '10','14','190/56  ','190',@p5 output,'2020-01-27 00:00:00'
select @p5



Но ошибка всё ровно выдаётся, хотя на клиенте всё четко указано...

Код: pascal
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.
procedure TForm47.cxButton1Click(Sender: TObject);
var
Ret_val: string;
begin
if (cxComboBox1.Text='') or (cxComboBox1.Text=NULL) or (cxComboBox2.Text='') or (cxComboBox2.Text=NULL) or (cxTextEdit1.Text='')
or (cxTextEdit1.Text=NULL) or (cxTextEdit2.Text='') or (cxTextEdit2.Text=NULL) or (cxTextEdit3.Text='') or (cxTextEdit3.Text=NULL)
or (cxDateEdit1.Text='') or (cxDateEdit1.Text=NULL)then
ShowMessage('Одно или несколько полей не заполнены')
Else
  Begin
    ADOStoredProc1.Close;
    ADOStoredProc1.ProcedureName:='MultiInsert_VK;1';
    ADOStoredProc1.Parameters.Clear;
    ADOStoredProc1.Parameters.CreateParameter('@min',ftString, pdInput, 10, NULL );
    ADOStoredProc1.Parameters.CreateParameter('@max',ftString, pdInput, 10, NULL);
    ADOStoredProc1.Parameters.CreateParameter('@Nomer_Protokol',ftString, pdInput, 15, NULL);
    ADOStoredProc1.Parameters.CreateParameter('@Code',ftString, pdInput, 10, NULL);
    ADOStoredProc1.Parameters.CreateParameter('@Error',ftString, pdOutput, 150, NULL);
    ADOStoredProc1.Parameters.CreateParameter('@Date_VK',ftDateTime, pdInput, 30, NULL);
    ADOStoredProc1.Parameters.ParamByName('@min').Value:=cxTextEdit3.Text;
    ADOStoredProc1.Parameters.ParamByName('@max').Value:=cxTextEdit2.Text;
    ADOStoredProc1.Parameters.ParamByName('@Nomer_Protokol').Value:=cxComboBox1.Text;
    ADOStoredProc1.Parameters.ParamByName('@Code').Value:=cxTextEdit1.Text;
    ADOStoredProc1.Parameters.ParamByName('@Date_VK').Value:=cxComboBox2.Text;
      try
        ADOStoredProc1.ExecProc;
      finally
        if ADOStoredProc1.Parameters.ParamByName('@Error').Value<>NULL then
          begin
            Ret_val := ADOStoredProc1.Parameters.ParamByName('@Error').Value;
            ShowMessage(Ret_val)
          end
      else
        begin
          Showmessage('Номера введены');
          Form4.ADODataSet1.Refresh;
        end;
      end;
  end;
end;
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926161
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA
действительно я чуть ошибся, экспериментировал и указал @Date_VK как InputOutput на клиенте, когда изменил на Input результат вроде нормальный стал
Код: sql
1.
2.
3.
4.
declare @p5 varchar(150)
set @p5=NULL
exec MultiInsert_VK;1 '10','14','190/56  ','190',@p5 output,'2020-01-27 00:00:00'
select @p5




Но ошибка всё ровно выдаётся, хотя на клиенте всё четко указано...


тут
автор
Код: sql
1.
2.
ALTER PROCEDURE [dbo].[MultiInsert_VK]
@min int, @max int, @Nomer_Protokol varchar(15), @Code int, @Date_VK datetime, @Error varchar(150) OUTPUT


у тебя другой порядок параметров ХП
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926248
FOGOT-BAstA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court, ага, начитался в инете, что это на самом деле важно, сделал в нужном порядке на клиенте и всё заработало! Всем огромное спасибо!
...
Рейтинг: 0 / 0
Задать числовую последовательность для поля
    #39926257
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FOGOT-BAstA
court, ага, начитался в инете, что это на самом деле важно , сделал в нужном порядке на клиенте и всё заработало! Всем огромное спасибо!
Если у ADOStoredProc есть property NamedParameters (вроде так называется), то установив его в True - можно сделать что бы было "не важно" :)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задать числовую последовательность для поля
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]