Убедитесь, что тип таблицы правильный из C # - PullRequest
3 голосов
/ 17 мая 2011

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

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

Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

Для SQL Server 2008 взгляните на системные таблицы sys.tables, sys.table_types и sys.columns.

В одной из моих баз данных у меня есть тип таблицы с именем candidateRoutes и физическая таблица.(реальная) таблица называется RouteArea

Следующие два запроса:

select sys.columns.* from sys.table_types join sys.columns on sys.columns.object_id = sys.table_types.type_table_object_id where sys.table_types.name = 'candidateRoutes'
select sys.columns.* from sys.tables join sys.columns on sys.columns.object_id = sys.tables.object_id where sys.tables.name = 'RouteArea'

return:

object_id  name     column_id  system_type_id  user_type_id  max_length  precision  scale  collation_name  is_nullable  is_ansi_padded    is_rowguidcol  is_identity  is_computed  is_filestream  is_replicated  is_non_sql_subscribed  is_merge_published  is_dts_replicated  is_xml_document  xml_collection_id  default_object_id  rule_object_id  is_sparse  is_column_set
215671816  RouteId  1           56              56            4          10         0      NULL            0            0                 0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0
215671816  Area     2          240             130           -1           0         0      NULL            0            0                 0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0

и

object_id   name       column_id  system_type_id  user_type_id  max_length  precision  scale  collation_name  is_nullable  is_ansi_padded  is_rowguidcol  is_identity  is_computed  is_filestream  is_replicated  is_non_sql_subscribed  is_merge_published  is_dts_replicated  is_xml_document  xml_collection_id  default_object_id  rule_object_id  is_sparse  is_column_set
1675153013  RouteId    1          127             127            8          19         0      NULL            0            0               0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0
1675153013  ValidFrom  2           61              61            8          23         3      NULL            0            0               0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0
1675153013  ValidTo    3           61              61            8          23         3      NULL            1            0               0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0
1675153013  Line       4          240             130           -1           0         0      NULL            0            0               0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0
1675153013  Area       5          240             130           -1           0         0      NULL            1            0               0              0            0            0              0              0                      0                   0                  0                0                  0                  0               0          0

таквозможно, вы могли бы сделать что-то вроде этого:

with
    TableType as
        (select name, user_type_id, max_length, precision from sys.columns where object_id = (select type_table_object_id from sys.table_types where name = 'candidateRoutes')),
    PhysicalTable as
        (select name, user_type_id, max_length, precision from sys.columns where object_id = (select object_id from sys.tables where name = 'RouteArea'))
    select * from TableType full join PhysicalTable
        on TableType.name = PhysicalTable.name
    where TableType.name is null
       or PhysicalTable.name is null
       or TableType.user_type_id <> PhysicalTable.user_type_id
       or TableType.max_length   <> PhysicalTable.max_length
       or TableType.precision    <> PhysicalTable.precision

, но включая scale, collation_name, is_nullable и т. д., чтобы найти все столбцы, которые не соответствуют.В моем случае я получаю:

name     user_type_id  max_length  precision  name       user_type_id  max_length  precision
RouteId  56            4           10         RouteId    127           8           19
NULL     NULL          NULL        NULL       ValidFrom  61            8           23
NULL     NULL          NULL        NULL       ValidTo    61            8           23
NULL     NULL          NULL        NULL       Line       130           -1          0

Если строки не возвращаются, тип и таблица совпадают.

1 голос
/ 19 мая 2011

Как вы сказали, в C # вам нужно будет выгружать данные из обеих таблиц в отдельные наборы данных, а затем проходить и сравнивать. Это было бы таким ресурсным бредом, и, скорее всего, приведет к очень нежелательной производительности, если у вас есть тысячи записей.

Вы должны сделать это в C #? Почему бы вам не выполнить сравнение в SQL и не вернуть результат bool (true, если все одинаково, false, если была разница)?

Но если вы должны сделать это в .NET, вы пытались изучить F #? Я немного читал, и похоже, что F # может улучшить производительность по сравнению с C # для такого рода анализа данных.

Вот статья, которая может помочь вам с F # и SQL.
http://tomasp.net/blog/dynamic-sql.aspx

Или, вы можете посмотреть на LINQ (извините, я неопытен с ним), это может быть ответом на то, что вы ищете. http://www.linqpad.net/WhyLINQBeatsSQL.aspx

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