数据驱动类型转换?

问题描述 投票:0回答:1

我在 SQL Server 中有一个键值对表,以及一个包含 T-SQL 数据类型和其他字段的字段,以指示特定字段是否是必填字段、唯一字段等。我编写了一个存储过程来输出规范化的数据数据表,使用数据类型字段来定义每个字段的类型。这效果很好。但是,在运行之前,我运行另一个过程来检查潜在的错误。一项明显的检查是:是否有任何数据违反指定类型?

我想写这样的东西:

SELECT [key], [value], [type]
FROM [source_table]
WHERE TRY_CONVERT([type], [value]) Is Null AND [value] Is Not Null

这将返回转换失败的记录(有一些例外,例如 int to date)。但是,这不起作用,因为 TRY_CONVERT 的第一个参数必须是关键字。

我发现的唯一解决方案是动态生成一个 SQL 块,该块针对要检查的每种数据类型运行一次。然而,这实在是太啰嗦了!不知道有没有人找到更简洁的方法?这一定是一个常见问题。

sql sql-server tsql type-conversion key-value
1个回答
0
投票

Case
表达式只能返回单一数据类型,因此针对各种数据类型返回
Try_Convert
的结果很混乱。您可以在
Try_Convert
中检查
Case
的结果以避免该问题:

declare @Samples as Table ( DT VarChar(32), V VarChar(32) );
insert into @Samples ( DT, V ) values
  ( 'Int', '42' ), ( 'Int', '-13' ), ( 'Int', '0xDEADBEEF' ),
  ( 'Date', '6/7/89' ), ( 'Date', '13/7/89' ), ( 'Date', '6/13/89' ), ( 'Date', '6/7/2' );
select DT, V, Ph.Status
  from @Samples cross apply
    ( select case
        when DT = 'Date' and Try_Convert( Date, V ) is NULL then 'failed'
        when DT = 'Int' and Try_Convert( Int, V ) is NULL then 'failed'
        else '' end as Status ) Ph
--  where Ph.Status != '' -- Uncomment if you only want to output failures.
  ;

dbfiddle.

© www.soinside.com 2019 - 2024. All rights reserved.