Сравните типы данных двух столбцов разных таблиц - PullRequest
0 голосов
/ 18 марта 2020

У меня есть две разные таблицы A и B, и я хочу скопировать данные из таблицы A в таблицу B, но только после сопоставления типов данных и ключевых ограничений (например, первичного ключа) двух столбцов. Если тип данных и ключевые ограничения совпадают, то копируют данные только из столбца таблицы A в тот же столбец таблицы B, в противном случае копируют эти данные в третью таблицу, т.е. таблицу error_log, а также упоминают ошибку в столбце errorvalue.

Я проверяю типы данных, как показано ниже:

SELECT C.NAME AS COLUMN_NAME,
       TYPE_NAME(C.USER_TYPE_ID) AS DATA_TYPE,
FROM SYS.COLUMNS C
WHERE C.OBJECT_ID=OBJECT_ID('table A');

Структуры таблиц выглядят следующим образом:

CREATE TABLE [dbo].[tableA](
    [CustomerId] [nvarchar](max) NULL,
    [Housenumber] [nvarchar](max) NULL,
    [Visit Id] [nvarchar](max) NULL,      ---primary key
    [Zipcode] [nvarchar](max) NULL,
    [City] [nvarchar](max) NULL,
    [Visit Date] [nvarchar](max) NULL,
    [Duration] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


CREATE TABLE [dbo].[tableB](
        [CustomerId] [nvarchar](2000) NULL,
        [Housenumber] [nvarchar](2000) NULL,
        [Visit Id] [nvarchar](2000) NULL,      
        [Zipcode] [nvarchar](2000) NULL,
        [City] [nvarchar](2000) NULL,
        [Visit Date] [datetime] NULL,
        [Duration] [float](max) NULL,
        [Counter 1] [nvarchar](100) NULL,
        [Counter 2] [nvarchar](100) NULL 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


CREATE TABLE [dbo].[error_log](
        [CustomerId] [nvarchar](max) NULL,
        [Housenumber] [nvarchar](max) NULL,
        [Visit Id] [nvarchar](max) NULL,      ---primary key
        [Zipcode] [nvarchar](max) NULL,
        [City] [nvarchar](max) NULL,
        [Visit Date] [nvarchar](max) NULL,
        [Duration] [nvarchar](max) NULL,
        [errorvalue] [nvarchar](max) NULL
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

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

1 Ответ

0 голосов
/ 18 марта 2020

Недостаточно сравнить только один тип данных.
Если это nvarchar / nchar / varchar / char / varbinary / binary, вам также необходимо сравнить максимально допустимый длина,
, если это date / time / datetime2 / datetimeoffset, вам нужно сравнить масштаб. и если это decimal / numeric, вам нужно сравнить масштаб и точность.

Чтобы проверить ключевые ограничения, вам нужно запросить еще две таблицы - sys.indexes и sys.index_columns.

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

Соответствующая часть кода находится в начале скрипта, где я заполняю таблицу, которую позже использую для построения динамических c SQL from - вот оператор select (я добавил псевдонимы, чтобы упростить его. чтобы понять):

SELECT  col.Name As ColumnName, 
        typ.Name As TypeName,
        CAST(col.max_length as nvarchar(11)) As MaxLength, 
        IIF(typ.name IN ('nvarchar', 'nchar', 'varchar', 'char', 'varbinary', 'binary'), 1, 0) As IncludeMaxLength, 
        IIF(idx.is_primary_key = 1, 1, 0) As IsPkColumn,
        col.is_identity As IsIdentity,
        col.is_computed As IsComputed,
        SIGN(/*col.generated_always_type*/0) As IsAutoGenerated, 
        IIF(typ.name IN('numeric', 'decimal'), 1, 0) As IncludePrecisionAndScale,
        col.[precision],
        IIF(typ.name IN('datetimeoffset', 'datetime2', 'time'), 1, 0) As IncludeScale,
        col.scale
FROM sys.columns as col
JOIN sys.types As typ
    ON  col.system_type_id = typ.system_type_id 
    AND col.user_type_id = typ.user_type_id 
JOIN sys.tables as tab
    ON col.object_id = tab.object_id 
LEFT JOIN sys.index_columns idxCol
    ON  col.object_id = idxCol.object_id 
    AND idxCol.column_id = col.column_id
LEFT JOIN sys.indexes idx
    ON  idx.object_id = tab.object_id 
    AND idxCol.index_id = idx.index_id
WHERE tab.name = @TableName

Вы можете выполнить этот запрос для обеих таблиц и сравнить любые соответствующие данные для любого столбца в таблицах.

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