Преобразование хранимой процедуры SQL Server в запрос - PullRequest
0 голосов
/ 14 октября 2019

Я хочу преобразовать хранимую процедуру в запрос SQL.

Вот хранимая процедура в простом формате:

SELECT
    table1.* 
INTO 
    #raw_data
FROM 
    table_1 WITH (NOLOCK)
WHERE 
    (a lot of conditions and filtering follows)

SELECT
    xyz,
    pqr,
    (SELECT (something)
     FROM #raw_data aa
     WHERE aa.id1 = a.id1
       AND aa.id2 = a.id2
       ...)
INTO 
    #temp_data
FROM 
    #raw_data a
JOIN 
    table_2 b WITH (NOLOCK) ON a.xid = b.xid

Чтобы преобразовать эту хранимую процедуру в запрос SQL, можноЯ заменяю все #raw_data во втором SELECT выражении на:

SELECT table1.*
FROM table_1 WITH (NOLOCK)
WHERE (a lot of conditions and filtering follows)

Я хотел бы знать, есть ли лучший способ сделать это.

1 Ответ

2 голосов
/ 14 октября 2019

Итак, вы превратили это в ...

SELECT xyz
, pqr
, (
    SELECT (something)
    FROM (
    SELECT table_1.*
        FROM table_1 WITH (NOLOCK)
        WHERE (a lot of conditions and filtering follows)
    ) aa
    WHERE aa.id1 = a.id1
    AND aa.id2 = a.id2
    ...
)

INTO #temp_data

FROM (
    SELECT table_1.*
    FROM table_1 WITH (NOLOCK)
    WHERE (a lot of conditions and filtering follows)
  ) a
  inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid

Но вы должны продолжать идти. В этом случае коррелированный подзапрос не нужен. Это, кажется, не добавляет никакой ценности. Это делает запрос более сложным. Это также замедляет его, поскольку подзапрос должен выполняться один раз для каждой строки во внешнем запросе. Чтобы воспользоваться возможностью SQL Server объединять массивы данных в массовом порядке ...

SELECT xyz
, pqr
, aa.something

INTO #temp_data

FROM (
    SELECT table_1.*
    FROM table_1 WITH (NOLOCK)
    WHERE (a lot of conditions and filtering follows)
  ) a
  inner join (
    SELECT table_1.*
    FROM table_1 WITH (NOLOCK)
    WHERE (a lot of conditions and filtering follows)
  ) aa on aa.id1 = a.id1
      and aa.id2 = a.id2
      ...
  inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid

Предполагая, что вы всегда соединяете table_1 с table_1, используя один и тот же столбец с обеих сторон объединения, как в вашемкод) вы можете упростить дальше. Будь осторожен здесь. Я предполагаю, что xid уникален или включен в соединение между a и aa. Если это не так, вам следует остановиться здесь.

Итак, если вы можете упростить дальнейшее, следующим шагом будет ...

SELECT xyz
, pqr
, a.something

INTO #temp_data

FROM (
    SELECT table_1.*
    FROM table_1 WITH (NOLOCK)
    WHERE (a lot of conditions and filtering follows)
  ) a
  inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid

... и его можно упроститьto ...

SELECT xyz
, pqr
, a.something

INTO #temp_data

FROM table_1 a WITH (NOLOCK)
  inner JOIN table_2 b WITH (NOLOCK) ON a.xid = b.xid

WHERE (a lot of conditions and filtering follows)

Похоже, что сложностей, которые вы не разделяете, может быть значительно больше (три точки неопределенности).

WHERE aa.id1 = a.id1
  AND aa.id2 = a.id2
  ...

Ваш пробег может отличаться.

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