Вы можете попробовать использовать подход на основе XML для вашей проблемы.Отправить XML в качестве входного параметра.Преобразовать XML в таблицу.Из таблицы формируйте динамический запрос и выполняйте его для достижения желаемой функциональности.Смотрите пример ниже.В этом примере Departments является таблица, которая содержит 3 столбца pkDepartmentId (int), DepartmentName (varchar) и BuildingNumber (int).Используя этот подход, вы можете отправить n параметров и их значений в качестве входных параметров.
pkDepartmentId DepartmentName BuildingNumber 1 Электроника и связь 1 2 Компьютерные науки 2 3 Приборы и технологии 4
--EXEC TestProc '<Parameters>
-- <Param>
-- <ColumnName>pkDepartmentId</ColumnName>
-- <ColumnValue>1</ColumnValue>
-- </Param>
-- <Param>
-- <ColumnName>DepartmentName</ColumnName>
-- <ColumnValue>Electronics and Communication</ColumnValue>
-- </Param>
-- <Param>
-- <ColumnName>BuildingNumber</ColumnName>
-- <ColumnValue>1</ColumnValue>
-- </Param>
-- </Parameters>'
CREATE PROCEDURE TestProc
@parameters XML
AS
BEGIN
DECLARE @temp1 TABLE
(
ColName VARCHAR(100)
, ColVal VARCHAR(4000)
)
INSERT INTO @temp1
SELECT Params.Col.value('ColumnName[1]', 'VARCHAR(50)') ColName
, Params.Col.value('ColumnValue[1]', 'VARCHAR(50)') ColVal FROM @parameters.nodes('//Parameters/Param') Params(Col)
DECLARE @sql VARCHAR(4000)
SET @sql = 'SELECT * FROM Departments WHERE '
SELECT @sql = @sql + ColName + ' = ''' + ColVal + ''' AND '
FROM @temp1
-- Trim last AND
SET @sql = SUBSTRING(@sql, 1, LEN(@sql) - 3)
PRINT @sql
EXEC (@sql)
END
Вклпри выполнении этого процесса получается следующий результат: pkDepartmentId DepartmentName BuildingNumber 1 Электроника и связь 1