Вы можете определенно устранить большую часть избыточности в своем коде, как SQLMenace указал в качестве начала.
Другое дело, ORDER BY не должен использоваться с INSERT..SELECT. ORDER BY не имеет смысла в этом контексте. Люди иногда используют его, чтобы заставить колонку IDENTITY вести себя определенным образом, но это плохая привычка IMO.
Не знаю, поможет ли это в вашей ситуации, но одна вещь, с которой я недавно столкнулся, заключалась в том, что в хранимых процедурах SQL Server (я использую 2005, но, вероятно, также и для 2000) не будет коротким. Схема ИЛИ условие во многих случаях. Например, когда вы используете:
@my_parameter IS NULL OR my_column = @my_parameter
он все равно будет оценивать вторую половину, даже если вы передадите значение NULL для @my_parameter. Это произошло даже тогда, когда я установил хранимую процедуру для перекомпиляции (и SELECT). Хитрость заключалась в том, чтобы вызвать короткое замыкание с помощью оператора CASE. Используя этот трюк (и удалив некоторую избыточность), ваш оператор будет выглядеть так:
INSERT INTO @tempCustTable
(
CustomerID,
FirstName,
LastName,
City,
StateProvince,
Zip,
PhoneNumber
)
SELECT DISTINCT
cu.CustomerID,
cu.FirstName,
cu.LastName,
a.City,
a.StateProvince,
a.Zip,
p.PhoneNumber
FROM Customer cu WITH(NOLOCK)
LEFT OUTER JOIN Address a WITH(NOLOCK) ON cu.CustomerID = a.CustomerID
LEFT OUTER JOIN Phone p WITH(NOLOCK) ON cu.CustomerID = p.CustomerID
WHERE
(cu.LastName LIKE @LastName + '%') AND
(1 =
CASE
WHEN @FirstName IS NULL THEN 1
WHEN cu.FirstName LIKE @FirstName + '%' THEN 1
ELSE 0
END
) AND
(1 =
CASE
WHEN @StateProvince = '' THEN 1
WHEN a.StateProvince = @StateProvince THEN 1
ELSE 0
END
) AND
(1 = CASE
WHEN @City = '' THEN 1
WHEN a.City LIKE @City + '%' THEN 1
ELSE 0
END
) AND
(1 = CASE
WHEN @Zip = '' THEN 1
WHEN a.Zip LIKE @Zip + '%' THEN 1
ELSE 0
END
)
Это делает запрос длиннее и, возможно, немного сложнее, но, возможно, оно того стоит для повышения производительности. Это особенно верно, если ваш критерий включает подзапрос, который в противном случае мог бы быть закорочен.
Наконец ... будьте совместимы с вашими параметрами. Для @FirstName вы проверяете значение NULL, чтобы определить, используется оно или нет, но для других вы проверяете наличие пустых строк. Базовое кодирование 101, с которым вам нужно быть осторожным.