【问题标题】:Stored procedure to check data type of every value检查每个值的数据类型的存储过程
【发布时间】: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


    【解决方案1】:

    尝试使用TRY_CONVERT函数。例如下面的查询返回无法转换为日期时间的数据

    select *  
    from table_A 
    where try_convert(datetime,dob) is null
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 2012-08-03
      • 1970-01-01
      • 2018-06-01
      • 2011-08-17
      • 1970-01-01
      相关资源
      最近更新 更多