Получите список вычисляемых столбцов в таблице базы данных (SQL Server)

Вот что-то, что первое, что пришло на ум кажется, что могло бы работать:

  1. Создают словарь с двойным ключом и список значений rectangle+boolean, как это:

    Dictionary< Дважды, List< KeyValuePair< Прямоугольник, булевская переменная>>> прямоугольники;

  2. Для каждого прямоугольника в Вашем наборе, найдите соответствующий список для x0 и значений x1, и добавьте прямоугольник к тому списку с булевым значением истинных для x0 и лжи для x1. Таким образом, у Вас теперь есть полный список всех x-координат, которые каждый прямоугольник или вводит (верный) или листы (ложь) направление X

  3. Захват все ключи из того словаря (все отличные x-координаты), отсортируйте их и цикл через них в порядке, удостоверьтесь, что можно достигнуть и текущее x-значение и следующее также (Вам нужны они оба). Это дает Вам, отдельные полосы прямоугольников

  4. Поддерживают ряд прямоугольников, на которые Вы в настоящее время смотрите, который начинается пустой. Для каждого x-значения Вы выполняете итерации в точке 3, если прямоугольник регистрируется в истинном значении, добавьте его к набору, иначе удалите его.
  5. Для полосы, отсортируйте прямоугольники по их Циклу y-координаты
  6. через прямоугольники в полосе, считая перекрывающиеся расстояния (неясный мне на данный момент, как сделать это эффективно)
  7. , Вычисляют ширину высоты времен полосы перекрывающихся расстояний для получения областей

Пример, 5 прямоугольников, тянут друг на друге, от до e:

aaaaaaaaaaaaaaaa          bbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaa          bbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaa          bbbbbbbbbbbbbbbbb
aaaaaaaaaaaaaaaa          bbbbbbbbbbbbbbbbb
aaaaaaaadddddddddddddddddddddddddddddbbbbbb
aaaaaaaadddddddddddddddddddddddddddddbbbbbb
        ddddddddddddddddddddddddddddd
        ddddddddddddddddddddddddddddd
        ddddddddddddddeeeeeeeeeeeeeeeeee
        ddddddddddddddeeeeeeeeeeeeeeeeee
        ddddddddddddddeeeeeeeeeeeeeeeeee
ccccccccddddddddddddddeeeeeeeeeeeeeeeeee
ccccccccddddddddddddddeeeeeeeeeeeeeeeeee
cccccccccccc          eeeeeeeeeeeeeeeeee
cccccccccccc          eeeeeeeeeeeeeeeeee
cccccccccccc
cccccccccccc

Вот список x-координат:

v       v  v   v      v   v         v  v  v   
|aaaaaaa|aa|aaaa      |   bbbbbbbbbb|bb|bbb
|aaaaaaa|aa|aaaa      |   bbbbbbbbbb|bb|bbb
|aaaaaaa|aa|aaaa      |   bbbbbbbbbb|bb|bbb
|aaaaaaa|aa|aaaa      |   bbbbbbbbbb|bb|bbb
|aaaaaaaddd|dddddddddd|ddddddddddddddbb|bbb
|aaaaaaaddd|dddddddddd|ddddddddddddddbb|bbb
|       ddd|dddddddddd|dddddddddddddd  |
|       ddd|dddddddddd|dddddddddddddd  |
|       ddd|ddddddddddeeeeeeeeeeeeeeeeee
|       ddd|ddddddddddeeeeeeeeeeeeeeeeee
|       ddd|ddddddddddeeeeeeeeeeeeeeeeee
ccccccccddd|ddddddddddeeeeeeeeeeeeeeeeee
ccccccccddd|ddddddddddeeeeeeeeeeeeeeeeee
cccccccccccc          eeeeeeeeeeeeeeeeee
cccccccccccc          eeeeeeeeeeeeeeeeee
cccccccccccc
cccccccccccc

список был бы (где каждому v просто дают координату, запускающуюся в 0 и повышающуюся):

0: +a, +c
1: +d
2: -c
3: -a
4: +e
5: +b
6: -d
7: -e
8: -b

Каждая полоса таким образом была бы (прямоугольники, отсортированные сверху донизу):

0-1: a, c
1-2: a, d, c
2-3: a, d
3-4: d
4-5: d, e
5-6: b, d, e
6-7: b, e
7-8: b

для каждой полосы, перекрытие было бы:

0-1: none
1-2: a/d, d/c
2-3: a/d
3-4: none
4-5: d/e
5-6: b/d, d/e
6-7: none
7-8: none

я предположил бы, что изменение вида + вводит/оставляет, алгоритм для проверки главной нижней части был бы выполнимым также:

  1. сортируют прямоугольники, которые мы в настоящее время анализируем в полосе, от начала до конца, для прямоугольников с той же главной координатой, сортируем их по нижней координате также
  2. , выполняют итерации через y-координаты, и когда Вы вводите прямоугольник, добавьте его к набору, когда Вы оставляете прямоугольник, удаляете его из набора
  3. каждый раз, когда набор имеет больше чем один прямоугольник, у Вас есть перекрытие (и если Вы удостоверяетесь, что добавили/удалили все прямоугольники, которые имеют ту же координату вершины/нижней части, на которую Вы в настоящее время смотрите, несколько перекрывающихся прямоугольников не были бы проблемой

Для полосы 1-2 выше, Вы выполните итерации как это:

0. empty set, zero sum
1. enter a, add a to set (1 rectangle in set)
2. enter d, add d to set (>1 rectangles in set = overlap, store this y-coordinate)
3. leave a, remove a from set (now back from >1 rectangles in set, add to sum: y - stored_y
4. enter c, add c to set (>1 rectangles in set = overlap, store this y-coordinate)
5. leave d, remove d from set (now back from >1 rectangles in set, add to sum: y - stored_y)
6. multiply sum with width of strip to get overlapping areas

Вы не должны были бы на самом деле поддерживать фактический набор здесь также, просто количество прямоугольников, которые Вы внутри, каждый раз, когда это идет от 1 до 2, хранит y, и каждый раз, когда это идет от 2 вниз к 1, вычислите, текущий y - сохранил y, и суммируйте это различие.

Hope это было понятно, и как я сказал, это первое, что пришло на ум, не протестировано всегда.

35
задан Dale K 8 August 2019 в 21:26
поделиться

1 ответ

Check the sys.columns system catalog view:

SELECT *
FROM sys.columns
WHERE is_computed = 1

This gives you all computed columns in this database.

If you want those for just a single table, use this query:

SELECT *
FROM sys.columns
WHERE is_computed = 1
AND object_id = OBJECT_ID('YourTableName')

This works on SQL Server 2005 and up.

UPDATE: There's even a sys.computed_columns system catalog view which also contains the definition (expression) of the computed column - just in case that might be needed some time.

SELECT *
FROM sys.computed_columns
WHERE object_id = OBJECT_ID('YourTableName')
59
ответ дан 27 November 2019 в 06:38
поделиться