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

Откуда:
Сообщений: 197
Добрый день! Не могу доделать процедуру для вставки в поле заданной последовательности чисел от @min до @max.
@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 раз больше...
Подскажите как реализовать правильно, чего не хватает!? Заранее спасибо.
11 фев 20, 12:46    [22077529]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30460
FOGOT-BAstA
Подскажите как реализовать правильно, чего не хватает!?
ROW_NUMBER()
11 фев 20, 13:52    [22077587]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30460
alexeyvg
FOGOT-BAstA
Подскажите как реализовать правильно, чего не хватает!?
ROW_NUMBER()
А, вы там используете ROW_NUMBER, да ещё и master..spt_values...

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

PS Как вы свой код читаете, без переводов строк? Скроллите мышкой вправо-влево?
11 фев 20, 13:57    [22077591]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
entrypoint
Member

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

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;
11 фев 20, 14:09    [22077610]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
alexeyvg, entrypoint
Спасибо, ваши советы очень помогли))
ЗЫ:У меня всё влезает на экране 24', ничего крутить не надо.
То, что получилось
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, однако текущий параметр выдан в результате запроса"
Менял тип параметра на клиенте, результата нет, явно в процедуре вопрос. Вроде он ничего возвращать не должен...
12 фев 20, 11:59    [22078117]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30460
FOGOT-BAstA
А можно еще вопрос, не могу понять, почему на клиенте выдаёт ошибку:
"Формальный параметр @Date_VK не был объявлен как параметр OUTPUT, однако текущий параметр выдан в результате запроса"
Менял тип параметра на клиенте, результата нет, явно в процедуре вопрос. Вроде он ничего возвращать не должен...
Скорее, это в вашем клиенте проблема.
Может, у него есть свои метаданные, в которых @Date_VK отмечен как возвращаемый. В частности, это могут быть метаданные, закешированные с прошлой версии процедуры.
Можно посмотреть вызов в профайлере, наверняка там будет @Date_VK OUTPUT
12 фев 20, 21:56    [22078817]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
alexeyvg,
Не имею опыта работы с профайлером, но вот что получается. Может я не те события выбрал...
Из поля TextData:

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 выходным параметром? А почему и как быть?))
13 фев 20, 08:42    [22078963]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30460
FOGOT-BAstA
Насколько я понимаю, SQL считает @p6, т.е. @Date_Vk выходным параметром? А почему и как быть?))
Нет, не SQL Server считает, а приложение.

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

А "почему" - это вам виднее, оно же у вас. Один из вариантов я озвучил, но могут быть и другие.
13 фев 20, 08:49    [22078967]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
alexeyvg,
действительно я чуть ошибся, экспериментировал и указал @Date_VK как InputOutput на клиенте, когда изменил на Input результат вроде нормальный стал
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


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

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;


Сообщение было отредактировано: 13 фев 20, 10:47
13 фев 20, 10:40    [22079037]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
court
Member

Откуда:
Сообщений: 1932
FOGOT-BAstA
действительно я чуть ошибся, экспериментировал и указал @Date_VK как InputOutput на клиенте, когда изменил на Input результат вроде нормальный стал
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



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


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

у тебя другой порядок параметров ХП
13 фев 20, 11:21    [22079062]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
FOGOT-BAstA
Member

Откуда:
Сообщений: 197
court, ага, начитался в инете, что это на самом деле важно, сделал в нужном порядке на клиенте и всё заработало! Всем огромное спасибо!
13 фев 20, 13:52    [22079245]     Ответить | Цитировать Сообщить модератору
 Re: Задать числовую последовательность для поля  [new]
court
Member

Откуда:
Сообщений: 1932
FOGOT-BAstA
court, ага, начитался в инете, что это на самом деле важно, сделал в нужном порядке на клиенте и всё заработало! Всем огромное спасибо!
Если у ADOStoredProc есть property NamedParameters (вроде так называется), то установив его в True - можно сделать что бы было "не важно" :)
13 фев 20, 14:01    [22079257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить