Как передать переменное число параметров в хранимую процедуру SQL Server? - PullRequest
13 голосов
/ 21 марта 2010

Я использовал SQL Server 2005 для моего небольшого веб-приложения. Хочу передать параметры в SP. Но есть одно условие. номер параметра, который можно менять время от времени. Подумайте, на этот раз я передам имя и адрес, в следующий раз я передам имя, фамилию, адрес,

этот диапазон параметров может быть 1-30,

Ответы [ 4 ]

12 голосов
/ 21 марта 2010

Вы объявляете процедуру с параметрами по умолчанию и вызываете ее с именованными параметрами вместо позиционных параметров:

CREATE PROCEDURE usp_myProcedure
  @name varchar(100) = '',
  @surname varchar(100) = '',
  @address varchar(100) = ''
AS
BEGIN
...
END

, чтобы вызвать ее из T-SQL:

exec usp_myProcedure @name='John', @surname = 'Doe';
exec usp_myProcedure @name='Jane', @address = '123 Anystreet';

Чтобы вызватьэто из C #:

SqlCommand cmd = new SqlCommand('usp_MyProcedure', ...);
cmd.CommandType = commandtype.StoredProcedure;
cmd.Parameters.AddWithValue('@name', 'John');
cmd.Parameters.AddWithValue('@surname', 'Doe');
10 голосов
/ 21 марта 2010

Вы можете использовать типы XML. Вот пример процедуры:

CREATE PROCEDURE udsp_VariableParams(@params XML)
AS
BEGIN
    DECLARE @vdoc INT
    EXEC sp_xml_preparedocument @vdoc OUTPUT, @params
    SELECT * FROM OPENXML(@vdoc, '/params/param', 1) WITH ([paramname] VARCHAR(40), [paramvalue] VARCHAR(150))
    EXEC sp_xml_removedocument @vdoc    
END

EXEC udsp_VariableParams 
  '<params>
     <param paramname="name" paramvalue="value"/>
     <param paramname="address" paramvalue="value"/>
  </params>'

EXEC udsp_VariableParams 
  '<params>
     <param paramname="name" paramvalue="value"/>
     <param paramname="surname" paramvalue="value"/>
     <param paramname="address" paramvalue="value"/>
  </params>'
6 голосов
/ 21 марта 2010

Можно установить значения по умолчанию для параметров на уровне SP, чтобы параметры стали необязательными.

, например

CREATE PROCEDURE dbo.Test
 @param1 int, -- Not an optional
 @param2 int = 10, --Optional
 @param3 bit = 0, --Optional
 @param4 varchar(50) = '', --Optional
 @param5 nvarchar(100) = null --Optional
 -- more parameters ..... 
AS
BEGIN

 -- The SQL goes here...

END

Затем вы можете заполнить необязательные параметры по вашему выбору.

1 голос
/ 29 июля 2013

Подготовка и извлечение тегов из XML - убийца производительности. Нестабильное время выполнения зависит от того, кэширован ли план или нет.

Вместо этого лучше использовать NVARCHAR (MAX). Просто подготовьте строки параметров с парой "@ name = Value" и добавьте уникальный разделитель параметров, если это необходимо. Внутри процедуры используйте SUBSTRING, CHARINDEX и т. Д. Для получения индивидуальных параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...