Код хранимой процедуры, которая получает одну запись или все записи из таблицы - PullRequest
0 голосов
/ 10 марта 2010

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

Таблица FOO имеет два поля: КОД и ОПИСАНИЕ. В Sql server 2008 я обычно создаю хранимую процедуру следующим образом:

CREATE PROCEDURE getFoo 
@CODE CHAR(3)=NULL
AS
IF @CODE is NULL 
  BEGIN
    SELECT CODE,DESCRIPTION FROM FOO
  END
ELSE
  BEGIN
    SELECT CODE,DESCRIPTION FROM FOO WHERE CODE=@CODE
  END
GO

Основная проблема с моим решением - это, очевидно, повторение SELECT, которое может быть болезненным, если в таблице много полей или много объединений с другими таблицами.

Другой подход, который я вижу в других SP:

CREATE PROCEDURE getFoo 
@CODE CHAR(3)=NULL
AS
DECLARE @FILTER CHAR(3)
SET NOCOUNT ON
IF @CODE is NULL SET @Filtro='%'
ELSE SET @FILTER =@CODE 

SELECT CODE,DESCRIPTION
FROM FOO
WHERE
CODE like @FILTER
GO

Какой код вы предпочитаете для этой простой задачи? Вы строите это динамически и в конце используете EXECUTE? спасибо

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Я полагаю, что из вашего кода TSQL, вот очень полная и довольно обширная статья Эрланда Соммарского об условиях динамического поиска в T-SQL. Это покажет, что единого правильного пути не существует, это зависит от многих факторов.

Он охватывает все "за" и "против" каждого возможного метода: http://www.sommarskog.se/dyn-search.html

1 голос
/ 10 марта 2010

Я бы сделал либо то, что вы сделали, либо иногда (в зависимости от моего настроения) просто:

SELECT CODE,DESCRIPTION FROM FOO WHERE CODE=ISNULL(@CODE,CODE)

Я бы НЕ рекомендовал создавать динамическую строку и выполнять ее, здесь или где-либо еще этого можно избежать,Это может влиять на производительность (но я не уверен, насколько это верно), это затрудняет чтение, вы получаете меньше проверки синтаксиса во время компиляции, когда вы компилируете proc, вы получаете меньше полезной информации о системных зависимостях,и (что хуже всего) вы можете открыть себя для атак с использованием SQL-инъекций.

0 голосов
/ 10 марта 2010
SELECT CODE,DESCRIPTION 
FROM FOO 
WHERE CODE=@CODE OR @CODE IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...