Где я могу найти определения для функций SQL Server (CONCAT, LAG)? - PullRequest
0 голосов
/ 27 июня 2018

Я внедряю простое хранилище данных на более чем 100 клиентах, у всех из которых есть база данных приложений. У некоторых клиентов есть SQL Server 2008, который запрещает моим скриптам ссылаться на CONCAT и LAG.

Начальные мысли о том, как решить эту проблему:

  1. Найдите определения для этих функций и примените их как UDF для экземпляра SQL 2008. (Я могу представить, что это работает для CONCAT, но не для LAG).
  2. Напишите мои собственные UDF. (Ограничения по времени).
  3. Замените ссылки CONCAT оператором '+' и оберните поля в функцию ISNULL. (Не решает проблему LAG).

Я думаю, что мог бы повторить поведение LAG, но я подозреваю, что потребуется некоторое время, чтобы заставить его эффективно работать с миллионами строк данных. Сборки повторяются в течение ночи, поэтому скорость - не самый высокий приоритет.

1 Ответ

0 голосов
/ 27 июня 2018

LAG Несовместимость:

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

Это упрощенная иллюстрация:

`CTE xyz(
    SELECT [Field 1]
    , [Field 2]
    , [Year]
    , [Period]
    , ROWCOUNT(PARTITION BY [field 1], ORDER BY [Year] ASC, [Period] ASC) [Row]
    FROM table
    ) 
SELECT *
, (SELECT [Field 2] FROM xyz x1 WHERE x1.[Field 1] = [Field 1] AND [Row] - 1 = x1.[Row]) [Old row] 
FROM xyz`

CONCAT Несовместимость:

Я использовал исторический оператор «+» для присоединения к VARCHAR и обслуживал значения NULL с помощью ISNULL, потому что хотел указать, какие данные действительно существуют.

SELECT ISNULL([Field 1], ''), + ISNULL([Field 2])
FROM table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...