Хранимая процедура для проверки типа данных каждого значения - PullRequest
0 голосов
/ 24 марта 2020

Я хочу создать хранимую процедуру, которая копирует данные из таблицы A в таблицу B. Структура таблицы выглядит следующим образом:

CREATE TABLE table_A
(
    Name nvarchar(max) NULL,
    Id nvarchar(max) NULL,
    dob nvarchar(max) NULL,
    duration nvarchar(max) NULL
)

CREATE TABLE table_B
(
    Name nvarchar(2000) NULL,
    Id nvarchar(2000) NULL,
    dob datetime NULL,
    duration float NULL
)

Я хочу скопировать данные из таблицы A в таблицу B, но после проверки каждое значение каждого столбца. Например, я должен проверить, что каждая копия table_A имеет формат datetime или нет. Значения в формате datetime должны быть скопированы только в table_B, и это должно быть сделано для всех столбцов соответственно.

Я пробовал следующим образом:

CREATE PROCEDURE [dbo].tester
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @abc TABLE ([COLUMN_NAME] varchar(50), [DATA_TYPE] varchar(50));

    INSERT INTO @abc 
        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');

    DECLARE @xyz TABLE ([COLUMN_NAME] varchar(max), [DATA_TYPE] varchar(max));

    INSERT INTO @xyz
        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_B')

    INSERT INTO @pp1
        SELECT c.column_name
        FROM information_schema.columns c
        WHERE c.table_name IN ('table_A', 'table_B')
        GROUP BY c.column_name
        HAVING MIN(data_type) <> MAX(data_type)

    DECLARE @lst nvarchar(max), @sql nvarchar(max);

    SELECT 
        @lst = STRING_AGG(column_name, ', ') WITHIN GROUP (ORDE RBY column_name) 
    FROM @pp;

    SET @sql = N'INSERT INTO table_B (' + @lst + N') SELECT ' + @lst + N' FROM table_A';

    EXEC sp_executesql @sql;
END

Это работает, но сравнивает тип данных столбцов не для самого значения в столбце.

1 Ответ

2 голосов
/ 24 марта 2020

Попробуйте использовать функцию TRY_CONVERT . Например, приведенный ниже запрос возвращает данные, которые невозможно преобразовать в datetime

select *  
from table_A 
where try_convert(datetime,dob) is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...