Я только что начал новую работу в Dev Ops в издательской компании.Моя первая задача - оптимизировать огромный SQL-запрос, состоящий из функций.Функции действительно медленные.Парень, который создал запрос, был умным, но не знал SQL и использовал функции, когда мог вместо этого использовать JOIN.У меня проблемы с преобразованием функций, которые имеют переменные.Например, это одна из функций.Здесь он находится в запросе, а рядом находится связанная функция, сохраненная в другом месте.
dbo.rpt_get_isbn(b.bookkey, 21) AS
f_upc
Затем функция ...
ALTER FUNCTION [dbo].[rpt_get_isbn](
@i_bookkey INT,
@i_isbn_type INT)
/* Returns the identifier such as EAN,
ISBN, with or without dashes
PARAMETER @i_isbn_type
10 = ISBN10
13 = ISBN 13
16 = EAN
17 = EAN (no dashes)
18 = GTIN
19 = GTIN (no dashes)
20 = LCCN
21 = UPC
*/
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @RETURN VARCHAR(50)
DECLARE @v_desc VARCHAR(50)
IF @i_isbn_type = 10
BEGIN
SELECT @v_desc = isbn10
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 13
BEGIN
SELECT @v_desc = isbn
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 16
BEGIN
SELECT @v_desc = ean
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 17
BEGIN
SELECT @v_desc = ean13
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 18
BEGIN
SELECT @v_desc = gtin
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 19
BEGIN
SELECT @v_desc = gtin14
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 20
BEGIN
SELECT @v_desc = lccn
FROM isbn
WHERE bookkey = @i_bookkey
END
ELSE IF @i_isbn_type = 21
BEGIN
SELECT @v_desc = upc
FROM isbn
WHERE bookkey = @i_bookkey
END
IF LEN(@v_desc) > 0
BEGIN
SELECT @RETURN =
LTRIM(RTRIM(@v_desc))
END
ELSE
BEGIN
SELECT @RETURN = ''
END
RETURN @RETURN
END
Таким образом, эта функция может возвращать различные результаты на основепеременная, заданная в качестве второго параметра.Если бы этого не было, это было бы легко.Я бы просто преобразовал его с помощью решения, подобного этому, чтобы снять обложку книги ..
LTRIM(RTRIM(bo.ean13)) AS p_coverimagepath
, и требуется СОЕДИНЕНИЕ ...
LEFT JOIN Isbn bo WITH (NOLOCK) ON bo.bookkey = b.bookkey
Но опять же, теперь яРабота с параметрами и функцией, которая использует If / elses для получения ответа.Так что мне нужно добавить эту логику if / else в мой основной запрос?Я не могу думать о способах, которые приведут к простому ответу.Я с нетерпением жду, чтобы выяснить это.Пожалуйста, дайте мне знать, если я забыл какие-либо важные элементы, чтобы понять, что я делаю.Спасибо!
ОБНОВЛЕНИЕ Вот куда идет код
,pss8.dbo.xml_StripIllegalChars(dbo.rpt_get_series_volume(b.bookkey)) AS
p_seriesvol
,CASE
WHEN dbo.rpt_get_isbn(b.bookkey, 17) = ''
THEN (
SELECT ipg_id
FROM tmmdb.ipg_extra.dbo.vw_Pss8IsbnOrUpc bo
WHERE bo.bookkey = b.bookkey
)
ELSE dbo.rpt_get_isbn(b.bookkey, 17)
END AS p_coverimagepath
,CASE
WHEN dbo.rpt_get_isbn(b.bookkey, 17) = ''
THEN (
SELECT ipg_id
FROM tmmdb.ipg_extra.dbo.vw_Pss8IsbnOrUpc bo
WHERE bo.bookkey = b.bookkey
)
ELSE dbo.rpt_get_isbn(b.bookkey, 17)
END AS TSP_p_coverimagepath
,pss8.dbo.xml_StripIllegalChars(replace(dbo.rpt_get_title(b.bookkey,
'T'), '&', '&')) AS p_title /* 30OCT14 */
,pss8.dbo.xml_StripIllegalChars(replace(dbo.rpt_get_sub_title(b.bookkey),
'&', '&')) AS p_subtitle /* 20OCT14 */