2015-02-25 6 views
0

Я использую SQL Server 2008. Мне нужно иметь возможность передавать данные таблицы через параметры хранимой процедуры.SQL Server 2008: назначение записи для переменных

Пример: MyTable (col1, col2) имеет следующие данные:

1, 'A' 
2, 'B' 
3, 'C' 

хранимой процедуры:

sp_read_tbl (@p1_col1 int  OUT, 
      @p1_col2 char(1) OUT, 
      @p2_col1 int  OUT, 
      @p2_col2 char(1) OUT, 
      @p3_col1 int  OUT, 
      @p3_col2 char(1) OUT) 

Как можно сделать это внутри хранимой процедуры?

+0

Это звучит так, будто вы делаете что-то странное. Не могли бы вы просто вставить в @table ... exec sp_read_tbl? а затем просто выберите записи в процедуре? –

+1

Вы ожидаете, что все эти вары станут передовыми? Почему бы просто не «выбрать col1, col2 из заказа yourDataSource в col1»? Похоже, вы используете достаточно параметров, чтобы гарантировать, что SP просто выбирает/возвращает значения да? – Kritner

ответ

1

Как уже отмечалось, это не обычный способ получения данных из таблицы в хранимой процедуре. И если ваша таблица когда-либо получает четвертую строку, вам придется повторно выполнять не только хранимую процедуру, но и код, который ее вызывает.

Но если вам действительно нужно это сделать, вы можете. Существует ряд подходов; мой вид будет выглядеть так:

-- DO NOT start your stored procs with "sp_". That's reserved for MS. 
-- Many people use "up_" as a substitute. 
create procedure dbo.up_read_tbl 
( 
     @p1_col1 int  OUT, 
     @p1_col2 char(1) OUT, 
     @p2_col1 int  OUT, 
     @p2_col2 char(1) OUT, 
     @p3_col1 int  OUT, 
     @p3_col2 char(1) OUT 
) 
AS 
    SELECT top 1 
      @p1_col1 = col1 
     , @p1_col2 = col2 
    FROM dbo.MyTable 

    SELECT top 1 
      @p2_col1 = col1 
     , @p2_col2 = col2 
    FROM dbo.MyTable 
    WHERE col1 <> @p1_col1 

    SELECT top 1 
      @p3_col1 = col1 
     , @p3_col2 = col2 
    FROM dbo.MyTable 
    WHERE col1 <> @p1_col1 
     AND col1 <> @p2_col1 
+0

Спасибо за ответ выше. Да, немного странно, но это ограничение вызывающего приложения. Есть ли способ сделать это через выбор курсора? Спасибо. – learningSQL

+0

@learningSQL Вы имеете в виду использование курсора внутри хранимой процедуры? Вы могли бы, определенно, но если у вас достаточно записей в таблице, чтобы сделать курсор более практичным, чем то, что я сделал, вы будете говорить о десятках выходных параметров. Кроме того, вам понадобится длинный фрагмент кода T-SQL, чтобы определить, какие параметры обновлять каждую итерацию. –

+0

@learningSQL. Вот мысль: может ли ваше приложение-приложение обрабатывать XML? Вы можете вернуть все содержимое таблицы как XML в одном выходном параметре. Затем вы можете преобразовать этот XML в DataTable или XmlDocument или XDocument для дальнейшей обработки. –

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