Создание хранимой процедуры с неопределенным количеством параметров - PullRequest
0 голосов
/ 03 июня 2018

Я должен сделать процедуру вставки, которая принимает неопределенное количество аргументов, например,

USER_ID, First_Name, Last_Name, Fav film, 'Fav Book', Fav Music

EXEC dbo.sp_whatever 'ID999', 'Tommy', 'Soprano', 'Jack', 'Forest Gump', 'Book_name', 'Music_Name'

ИЛИ

USER_ID, First_Name, Last_Name, Fav film

EXEC dbo.sp_whatever 'ID999', 'Ashley', 'Collins', 'Cujo'

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

Теперь у меня нет абсолютно никакой идеи, как подойти к этому, как я могу работать с неопределенным числом параметров, или что будетправильно, правильный способ приблизиться к этому?

РЕДАКТИРОВАТЬ:

В основном.Это был бы сценарий.Я пишу процедуру хранилища, называемую «InsertNewUser». У меня есть человек, которого я хочу зарегистрировать, поэтому я делаю «EXEC InsertNewUser ...», и я ВСТАВЛЯЮЮ всю соответствующую информацию об этом человеке в нужные таблицы.Это в основном то, чего я пытаюсь достичь.(Я знаю, что сценарий глуп, не волнуйтесь, придумано.)

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

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

Метод # 1 - Передача CSV: список строк в качестве параметра параметру типа данных (N) VARCHAR, затем разделение /парсинг его внутри SP или UDF.

Метод # 2 - Передача строки XML: в качестве параметра типа данных XML.Нам нужно будет проанализировать XML внутри SP.

Метод № 3 - Использование временной таблицы: внутри SP, который создается снаружи непосредственно перед его выполнением.Здесь нет необходимости передавать какой-либо параметр с помощью SP.

Метод № 4 - Использование TVP: С SQL Server 2008 и выше вы можете создавать TVP или Table-Valued Parameters и объявлять их с помощью пользовательских типов таблиц,Затем эти TVP можно использовать для отправки нескольких строк данных в SP или UDF без создания временной таблицы или нескольких параметров.

Метод # 5 - Передача строки JSON: в качестве параметра типа данных NVARCHAR.Нам нужно будет проанализировать JSON внутри SP.

Ссылка

0 голосов
/ 07 июня 2018

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

create procedure AddUser
  @UserId Int Output,
  @FirstName NVarChar(64),
  @LastName NVarChar(64),
  @FavoriteHandbag NVarChar(64) = NULL,
  @FavoriteShoe NVarChar(64) = NULL,
  @FavoriteWeapon NVarChar(64) = NULL
as
  -- Validate the inputs.
  if ( @FavoriteHandbag is NULL ) and ( @FavoriteShoe is NULL ) and ( @FavoriteWeapon is NULL )
    begin
    RaIsError( 'New users must have at least one favorite specified.', 13, 0 );
    return;
    end
  -- tbd: Check for missing or duplicate name, ... .

  -- Store the data.
  insert into Users ( FirstName, LastName, FavoriteHandbag, FavoriteShoe, FavoriteWeapon )
    values ( @FirstName, @LastName, @FavoriteHandbag, @FavoriteShoe, @FavoriteWeapon );

  -- Return the new user's   UserId .
  set @UserId = Scope_Identity();
go

-- Test the SP.
declare @UserId as Int;

-- Without any favorites it ought to fail.
exec AddUser @UserId = @UserId output, @FirstName = 'William', @LastName = 'Shakespeare';

-- With any combination of favorites it ought to succeed.
exec AddUser @UserId = @UserId output, @FirstName = 'William', @LastName = 'Shakespeare',
  @FavoriteWeapon = 'pen';

exec AddUser @UserId = @UserId output, @FirstName = 'William', @LastName = 'Shakespeare',
  @FavoriteShoe = 'moccasin', @FavoriteWeapon = 'pen';

Если реальная проблема ™ заключается в том, что параметры могут содержать произвольный список имени / значенияпары, например { 'Topping', 'Whipped Cream' }, которые заранее неизвестны, тогда необходимо использовать другой метод.Если количество пар ограничено, то можно использовать параметры, например @Name1, @Value1, @Name2, @Value2, ....Параметр TVP или XML обеспечит более точное представление списка пар.

0 голосов
/ 03 июня 2018

Вы можете создать тип в виде таблицы и передать переменную этого типа.Нравится:

CREATE TYPE your_sp_args
            AS TABLE (n integer
                      v varchar(MAX));

CREATE PROCEDURE your_sp @args your_sp_args
...;

DECLARE @args your_sp_args;

INSERT INTO @args
            (n,
             v)
            VALUES (1,
                    'FOO');

EXECUTE your_sp @args;

INSERT INTO @args
            (n,
             v)
            VALUES (2,
                    'BAR');

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