Как применить принцип DRY к SELECT в SQL процедурах? - PullRequest
0 голосов
/ 02 марта 2020

У меня есть несколько SQL хранимых процедур, запрашивающих одну и ту же таблицу с разными аргументами и предложениями WHERE. Как определить столбцы в SELECT в одном месте, чтобы они были общими для всех аналогичных процедур? Не могли бы вы также поделиться информацией о влиянии на производительность или ремонтопригодность?

CREATE PROCEDURE [dbo].[stp_Metadata_GetById]
  @Id int = 0
AS
  SELECT M.Id,
         M.Name
         -- A long list of column selections
  FROM   dbo.Metadata M
  WHERE  M.Id = @Id;
CREATE PROCEDURE [dbo].[stp_Metadata_GetByName]
  @Name nvarchar(200)
AS
  SELECT M.Id,
         M.Name
         -- A long list of column selections
  FROM   dbo.Metadata M
  WHERE  M.Name = @Name;

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Как определить столбцы в SELECT в одном месте, чтобы они были общими для всех аналогичных процедур?

Короче говоря, вы не можете. SQL - это не процедурный язык программирования, а декларативный. Следовательно, такие принципы, как DRY, на самом деле не действуют в мире SQL.

Ваш единственный вариант здесь - следовать совету @ jarlh и создать единую процедуру, позволяющую передавать несколько параметров для фильтрации. на разных столбцах все в пределах одной процедуры. Это будет связано с его собственными проблемами, поскольку теперь у вас есть монолитная процедура, которую вам нужно будет отслеживать и поддерживать по мере роста и развития вашей базы данных.

0 голосов
/ 02 марта 2020

Вам просто нужно создать один sp с 2 параметрами вместе со значением по умолчанию, равным нулю.

После этого вы можете использовать логические логики c вроде @Id is null or M.Id = @Id

CREATE PROCEDURE [dbo].[stp_Metadata_GetBy]
  @Id int = null,
  @Name nvarchar(200) = null
AS
  SELECT M.Id,
         M.Name
         -- A long list of column selections
  FROM   dbo.Metadata M
  WHERE  (@Id is null or M.Id = @Id) 
         and (@Name is null or M.Name = @Name);

Как использовать

exec stp_Metadata_GetBy @Id = 1 -- if you want to query by ID

exec stp_Metadata_GetBy @Name = 'abc' -- if you want to query by Name

Похоже на это выражение 'CASE', применять условие WHERE к запросу или нет

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