Как передать значения из таблицы в хранимую процедуру в качестве параметров? - PullRequest
0 голосов
/ 13 сентября 2018

Я борюсь с чем-то, что выглядит очень просто, и все же я не нахожу никакого решения:

  1. У меня есть Таблица с именем Отели , которая является первым столбцом вэто, = = 1006 * [hotels_id] [int]
  2. У меня есть хранимая процедура, которая зависит от hotels_id значение

Сейчас в хранилищеПроцедура, я набрал только одно значение (1) в качестве примера, скажем, у меня есть что-то вроде 50 строк.

Есть какой-либо способ передать все строки из таблицы в SP в качестве параметра, каждое из которых ввремя?Я имею в виду один за другим.

ALTER PROCEDURE [dbo].[spAvailableRooms]
AS
BEGIN
-- Derived tables
;with

DatesTable as
    (SELECT top (100) PERCENT Dates.dates_id as Id, Dates.dates_date as Date FROM Dates order by Dates.dates_id),

 AvaliablePerHotel as
    (SELECT top (100)percent Available_since AS Since, Available_value AS Value, Available_hotel as Hotel
                    FROM Available_rooms 
                    where  Available_hotel =1 --(HERE I NEED THE VALUES FROM TABLE)
                    ORDER BY Available_hotel, Available_since),

AllDays as
    (Select top (100)percent Id, Date, Value as Rooms, iif(value is null, '0' ,'1') as New, Hotel
        From DatesTable left JOIN AvaliablePerHotel ON Id = Since
        order by id),

AvailableGroups as
    (Select top (100)percent Hotel, Id, Date, Rooms, (sum(isnull(cast(new as float),0))over(order by id)) as RowGroup
    From AllDays
    order by id)
--

-- Query itself

Select Id, Date, iif(Rooms is null,(first_value(rooms) over (partition by RowGroup order by Id)) , Rooms) as  AvailableRooms,
        iif(Hotel is null,(first_value(Hotel) over (partition by RowGroup order by Id)) , Hotel) as  Hotel
From AvailableGroups
order by id

END

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Если вы хотите передать значения, как вы сказали одно за другим, тогда курсор - ваш лучший вариант

declare @id int

DECLARE cursor CURSOR FOR   
SELECT hotels_id
FROM Hotels

OPEN cursor  

FETCH NEXT FROM cursor   
INTO @id

WHILE @@FETCH_STATUS = 0  
BEGIN  

    exec [dbo].[spAvailableRooms] @id

    FETCH NEXT FROM cursor   
    INTO @id
END   
CLOSE cursor;  
DEALLOCATE cursor;  

Затем измените вашу процедуру, передайте параметр

ALTER PROCEDURE [dbo].[spAvailableRooms] @id int

и замените гдевы жестко закодировали «1» в своем коде с помощью @ id

Обратите внимание, что по мере роста таблицы курсоры становятся однопоточными, время выполнения будет расти довольно быстро.

0 голосов
/ 13 сентября 2018

Вы можете использовать пользовательские типы таблиц (подробнее здесь )

Сначала вы определяете тип, который представляет структуру, которую вы хотите передать хранимой процедуре:

CREATE TYPE [schemaName].[typeName] AS TABLE(
    [Column0] [nvarchar](255) NULL,
    [Column1] [nvarchar](255) NULL,
    [Column2] [nvarchar](255) NULL,
    [Column3] [nvarchar](255) NULL,
    [Column4] [nvarchar](255) NULL,
    [Column5] [nvarchar](255) NULL,
    [Column6] [nvarchar](255) NULL,
...
)

Теперь вы можете создать хранимую процедуру, которая принимает в качестве входных данных переменную типа, определенного в предыдущем скрипте:

CREATE PROCEDURE [schemaName].[SpLoad]
(
    @myRows [schemaName].[typeName] READONLY
)
    AS
    BEGIN
        INSERT INTO schemaName.DestinationTable
        SELECT * FROM @myRows
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...