SQL Server устанавливает несколько переменных - PullRequest
2 голосов
/ 28 октября 2011

У меня есть 7 разных хранимых процедур, которые принимают ряд параметров и вставляют данные в 7 разных таблиц.

Сейчас я создаю основную хранимую процедуру для выполнения этих 7 процедур со всеми необходимыми данными.,Все данные, которые им нужны, это ОДНА таблица (CommonImport).

Должен ли я взять все параметры, которые мне нужны в этой основной хранимой процедуре?

Или

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

Я думаю, что второй вариант лучше.НО, как мне установить все переменные в основной хранимой процедуре для всех данных из таблицы (CommonImport)?

По сути, как мне установить группу объявленных переменных для значений из конкретной строкив таблице CommonImport?

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 октября 2011

Передача ID:

Преимущество заключается в том, что вы упрощаете все интерфейсы для своих хранимых процедур.

Это облегчает кодирование. Если в итоге вы вызываете SP из нескольких мест, вам просто нужно использовать один параметр, а не загружать и передавать несколько параметров.


Передача n Переменные:

Тогда выгода в том, что вы «отделяете» свои хранимые процедуры от таблицы хранения.

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


Что лучше:

Я не думаю, что есть прямой ответ на это, это скорее случай предпочтений и мнений.

Мое мнение таково: чем менее тесно связаны вещи, тем лучше. Он более гибок перед лицом изменений.

Я бы сделал это следующим образом ...

CREATE PROCEDURE main_by_variable @v1 INT, @v2 INT, ...
BEGIN
  EXEC sub_part_1 @v1, @v3
  EXEC sub_part_2 @v2
  EXEC sub_part_3 @v2, @v3
  ...
END

CREATE PROCEDURE main_by_id @id INT AS
BEGIN
  DECLARE
    @v1 INT,
    @v2 INT,
    ...
  SELECT
    @v1 = field1,
    @v2 = field2
  FROM
    holding_table
  WHERE
    id = @id

  EXEC main_by_variable @v1, @v2, ...
END
GO;

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

Но для удобства вы можете обнаружить, что использование main_by_id более аккуратно. Так как это всего лишь оболочка для main_by_variable, все, что вы делаете, это инкапсулируете один шаг в процессе (извлечение данных из таблицы).

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

2 голосов
/ 28 октября 2011

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

CREATE PROCEDURE MainSP
  @ID int,
  @CustomParameter  varchar(10) = NULL,
  @CustomParameter1 DateTime = NULL,
  ...

Таким образом SP будет довольно гибким

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