2016-09-12 2 views
1

Я занят попыткой переписать некоторые хранимые процедуры/функции PostgreSQL для SQLQL 2014s TSQL.Процедура TSQL, возвращающая несколько строк данных

Я изо всех сил пытаюсь вернуть свои значения из этой хранимой процедуры, но это всего лишь тест, но я пытаюсь вернуть несколько строк данных в этом случае для двух переменных si_code и co_desc.

У меня есть процедура следующим образом (в качестве теста)

if (object_id('p_get_serial')) is not null 
    drop procedure p_get_serial 
go 

create procedure p_get_serial(@par01 char(20), @par02 integer) 
as 

    declare 
     @co_num integer, 
     @co_desc char(20), 
     @si_code char(20), 
     @log char(40) 

    declare mycur cursor for 
     select co_num, co_desc 
     from colours 
     where co_num <= @par02 

    open mycur 
    fetch next from mycur into @co_num, 
           @co_desc 

    while @@FETCH_STATUS = 0 
    begin 

     set @si_code = '' 

    select @si_code = si_code 
     from sitems 
     where si_co_num = @co_num 

     set @log = @co_desc + ' ' + @si_code 
     raiserror(@log,0,1) with nowait 

     fetch next from mycur into @co_num, @co_desc 

    end 
    close mycur deallocate mycur 

go 

exec p_get_serial @par01 = 'paramater01', @par02 = 10 

, что это лучший способ, чтобы вернуть мои результаты, зная, что там будет несколько строк?

+0

Вы должны показать свою таблицу ввода и желаемый результат, похоже, что вы не должны использовать курсор вообще (они являются последним средством). Каково намерение безусловного расизма? –

+0

в этом примере мне не нужен курсор, это просто тест, реальная процедура слишком сложна, чтобы обойтись без курсора. – Trent

+0

Вы также можете рассмотреть функцию, которая выводит таблицу. Но если SP - единственный способ - создать/определить переменную таблицы и вывести ее в конце sp. Кроме того - обычно курсоры являются «плохими» в sql-сервере (низкая общая производительность). Если вы можете найти способ избежать курсоров, вы получите лучшую производительность. – ripvlan

ответ

1

В T-SQL вам не нужно объявлять курсор. Просто select, что вам нужно, и оно будет доступно для клиентского приложения.

Курсор - это Oracle/DB2/PostgreSQL и т. Д. Способ возврата данных. SQL Server не нуждается в этом.

create procedure p 
as 
    select 1 as a 

возвращает набор записей, содержащий одну запись с одной колонкой.

create procedure p 
as 
    select 1 as a, 'a' as b 
    union select 2, 'b' 

возвращает две строки с двумя колонками.

Пример более сложной обработки перед возвращением результирующего набора:

create procedure p 
as 
begin 
    declare @a int, @b varchar(10) 

    select @a = 1 
    select @b = convert(varchar(10), @a) 

    select @a = @a + 1 

    select @a as a, @b as b -- this will be the resultset returned to the client 
end 
+0

Я не смогу добиться результатов, которые мне нужны с помощью одного выбора, процедура, которую я пытаюсь воссоздать, гораздо более активна. – Trent

+0

. Вы можете разработать свою процедуру, как бы сложной она ни была, я просто покажу вам технологию, которую вы должен будет использоваться в MS SQL: ваш последний 'select' возвращает результат для клиента. Любая обработка, которая создает этот набор данных, полностью зависит от вас. Но также имейте в виду, что если вам не нужен набор результатов, вы также можете https://technet.microsoft.com/en-us/library/ms187004%28v=sql.105%29.aspx – ajeh

+0

Это именно то, что Мне нужна благодарность – Trent

0

Все, что вам нужно сделать, это, просто сохраните данные для каждой строки в таблице темп или табличной переменной и просто написать ЗЕЬЕСТ в конце хранимой процедуры. Ваш вопрос непонятен, что вам нужно в точности, у вас есть курсор и цикл while, они кажутся избыточными

Смежные вопросы