T-SQL - хранимая процедура, которая будет обрабатывать неизвестное количество параметров неизвестных типов - PullRequest
1 голос
/ 10 февраля 2012

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

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

Как бы вы справились с этим?

Ответы [ 4 ]

4 голосов
/ 10 февраля 2012

Не делай этого.Вы собираетесь снизить производительность всей базы данных.T-SQL и повторное использование кода не смешиваются.

То, что вы можете сделать, - это создать все эти хранимые процедуры автоматически.Есть много инструментов, которые делают это, и вы можете легко свернуть свой собственный: использовать сам SQL, чтобы извлечь определение таблицы в XML, затем использовать XSLT, чтобы преобразовать это в T-SQL и сгенерировать процедуру.Он может быть автоматизирован для сборки вашего проекта и непрерывного процесса интеграции.Таким образом, вы получаете лучшее из обоих миров: строгие типы, эффективный код T-SQL, а также гибкий, СУХОЙ и поддерживаемый процесс, который позволяет легко переписать все эти сотни процессов с одним единственным изменением.

2 голосов
/ 10 февраля 2012

Вы можете попробовать использовать подход на основе 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

1 голос
/ 18 декабря 2012

Как насчет использования табличных параметров TVP (при условии, что ваша версия SQL Server> = 2008)?Это не решает часть "неизвестных типов", хотя.Я полагаю, вам придется использовать varchar (max) или даже nvarchar (max), а затем разыграть его по мере необходимости ...

См .: http://www.sommarskog.se/arrays-in-sql-2008.html

Для более старых версий SQL Server:см. также:

0 голосов
/ 10 февраля 2012

параметры по умолчанию:

create procedure MyPRoc1
(
@param1 int,
@param2 int =1
)
as
begin
    --code
end

Вы можете вызвать его, используя

exec MyPRoc1 10

или

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