Как передать переменное количество параметров в хранимую процедуру SQL Server?
Я использовал SQL Server 2005 для своего небольшого веб-приложения. Я хочу передать параметры SP.
Но есть одно условие. количество параметров, которые могут меняться время от времени.
Подумайте, на этот раз я передаю имя и адрес, в следующий раз я передам имя, фамилию, адрес,
этот диапазон параметров может быть 1-30,
Ответы
Ответ 1
Вы объявляете процедуру с параметрами по умолчанию и вы вызываете ее с именованными параметрами вместо позиционных параметров:
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';
Чтобы вызвать его из С#:
SqlCommand cmd = new SqlCommand('usp_MyProcedure', ...);
cmd.CommandType = commandtype.StoredProcedure;
cmd.Parameters.AddWithValue('@name', 'John');
cmd.Parameters.AddWithValue('@surname', 'Doe');
Ответ 2
Вы можете использовать типы 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>'
Ответ 3
Вы можете установить значения по умолчанию для параметров на уровне 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
Затем вы можете заполнить необязательные параметры по вашему выбору.
Ответ 4
Подготовка и выведение тегов из XML - это убийца производительности. Несогласованные сроки выполнения зависят от того, сохранен ли план или нет.
Использование NVARCHAR (MAX) вместо этого является лучшим вариантом. Просто подготовьте строки параметров с помощью пары "@name = Value" и при необходимости добавьте уникальный параметр sepearetor. Внутри процедуры используйте SUBSTRING, CHARINDEX и т.д., Чтобы получить индивидуальные параметры.