Обновление / выбор критериев таблицы памяти SQL Server 2008 - PullRequest
0 голосов
/ 27 января 2011

У меня есть таблица в памяти внутри хранимой процедуры.Таблица никогда не будет больше 12 записей и основана на разборе строки.Значения добавляются ПОСЛЕ того, как происходит анализ, а значения НЕ загружаются на основе порядкового номера (и не могут быть).Столбец «тип» представляет тип данных, значения которых имеют следующие значения:

  0 = primary
  1 = secondary
  2 = literal

И при его загрузке действуют следующие правила:

 - a secondary only applies to the first primary with a lower ordinal.  
 - a literal will never exist between a primary and a secondary (within ordinal order)

Данные, которые мне нужны (в порядковом числе)порядок) первичный или литеральный, если первичный не равен NULL / пусто, затем первый NON нулевой / пустой вторичный до следующего первичного / литерального.

DECLARE @data TABLE (
[type]    Integer,
[value]   VarChar(200),
[ordinal] Integer,
family  Integer                -- added for answer
)

-- dummy data for test purposes
INSERT INTO @data
SELECT 0, '', 0, 0;

INSERT INTO @data
SELECT 1, 'sec1', 1, 0;

INSERT INTO @data
SELECT 1, 'sec2', 2, 0;

INSERT INTO @data
SELECT 2, '/', 3, 1;

INSERT INTO @data
SELECT 0, 's1', 4, 2;

INSERT INTO @data
SELECT 1, 'so', 5, 2;

INSERT INTO @data
SELECT 2, '-', 6, 3;

INSERT INTO @data
SELECT 1, 'p0', 7, 4;
-- done load of data

-- update data here to blank all the non needed records


DECLARE @output  VarChar(1000)
SELECT @output = CASE
          WHEN @output IS NULL THEN value
          ELSE @output + value
      END
FROM @data
WHERE value != ''
ORDER BY ordinal;

-- ideally @output should look like: "sec1/s1-p0"

Вывод, потому что первичный порядковый номер 0 пуст, ивторичный порядковый номер 1 не так использовать, и пропустите вторичный порядковый номер 2. буквальный порядковый номер 3. первичный порядковый номер 4 НЕ пуст, поэтому используйте его, пропустите вторичный порядковый номер 5. буквальный порядковый номер 6 и непустой первичный порядковый номер 7.

Iя пытаюсь НЕ использовать курсор здесь, если это возможно.

Хорошо, я понял это.Я добавил еще одно поле в таблицу для группировки первичных и вторичных данных.Тогда я просто получаю порядковый номер min () в группе, где значения НЕ были пустыми или NULL.Сделайте соединение обратно к основному столу, и теперь у меня есть требуемый ответ.

SELECT @output = CASE
          WHEN @output IS NULL THEN value
          ELSE @output + value
      END
FROM @data p
INNER JOIN ( SELECT family, MIN( ordinal) As 'ordinal'
             FROM @data WHERE ISNULL( value, '') != '' 
             GROUP BY family ) s ON p.ordinal = s.ordinal AND p.family = s.family
WHERE value != ''
ORDER BY ordinal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...