【发布时间】:2020-07-04 13:46:23
【问题描述】:
我想创建一个存储过程,将数据从表 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 的每个 dob 是否为 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
它正在工作,但比较列的数据类型在列中不是很有价值。
【问题讨论】:
标签: sql sql-server tsql stored-procedures dynamic-sql