2013-09-13 1 views
3
CREATE PROCEDURE Testing1 
@Varaible nvarchar(50), 
@value integer 
AS 
BEGIN 
DECLARE @SUMM FLOAT 
SET @SUMM=(@value*2.38/7.456)*2 
PRINT @Varaible 
PRINT 'EXPENSES IS' 
PRINT @SUMM 
END 
Output is: 
PETER 
EXPENSES IS 
24.2597 

Приведенный выше мой код, где я передаю один параметр ввода.Одиночная переменная состоит из количества символов в хранимой процедуре?

Если я хочу передать несколько значений, как peter,robber,licoln,mat

@varaible peter,robber,licoln,mat

@value 37 45 66 77 возможно в SQL ??

+1

Возможно * возможно * - но определенно * нет * хорошая идея! –

+0

Не уверен, но вы можете передать строку с разделителем, а затем [искать разделительную строку в SQL] (http://stackoverflow.com/questions/2647/split-string-in-sql) – Habib

+0

@marc_s Моя сохраненная процедура будет прикреплен к frent end с использованием .net. Пользователь будет вводить 3 или более ??? – vision

ответ

2

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

Если, однако, ваши строки с разделителями могут содержать сотни или тысячи дискретных значений, то вызов proc, который много раз может быть дорогостоящим с точки зрения производительности, особенно если вы не можете отправить их все в одном пакете (I ' что вы хотите использовать параметры, а не гигантскую конкатенированную команду). В этом случае у вас есть несколько вариантов:

  • Использование Table Valued Parameters. Это похоже на передачу массивов в качестве аргументов для вашего proc.
  • Pass XML to your proc, затем измельчить и обработать его в рамках процедуры.
  • Вставьте данные в таблицы промежуточной/временной таблицы, затем вызовите процедуру для работы с этими таблицами.
  • Сделайте шаг назад и посмотрите, имеет ли смысл делать больше обработки в вашем приложении. Код БД обычно не масштабируется почти так же, как и код приложения.
  • Отправьте эти строки с разделителями в свой proc, split/parse them, затем сверните результаты в SQL. Кажется, это то, о чем вы спрашиваете, и, возможно, это наименее элегантный вариант, хотя это один из самых популярных способов злоупотребления реляционной базой данных.
0

Подход, основанный на оценке табличных параметров, кажется очень доступным, но доступен только для MSSQL 2008. Если вы все еще придерживаетесь MSSQL 2005, возможно, временный подход к таблице работает лучше всего для вас?

Ваш код может выглядеть примерно так:

-- define your stored procedure 
CREATE PROC sptest1 AS 
BEGIN 
    -- do some stuff with #tmp, like join it to other tables 
    -- and UPDATE values in these tables with it! 
    -- or simply list a processed version of #tmp: 
    SELECT nam,val*(2.38/7.456)*2 FROM #tmp 
END 

-- prepare input values by creating a temporary table on the fly 
SELECT 'Peter' nam,23 val INTO #tmp 
UNION ALL SELECT 'Paul',27 
UNION ALL SELECT 'Harry',16 
UNION ALL SELECT 'Mary-Ann',45; 

-- and call the procedure: 
EXEC sptest1 

Таким образом, ваш внешний интерфейс будет строить SELECT ... INTO #tmp ... строку. После этого остальная часть обработки может быть выполнена внутри хранимой процедуры.

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