Я хочу создать хранимую процедуру, которая копирует данные из таблицы 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
Это работает, но сравнивает тип данных столбцов не для самого значения в столбце.