我在 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 块,该块针对要检查的每种数据类型运行一次。然而,这实在是太啰嗦了!不知道有没有人找到更简洁的方法?这一定是一个常见问题。
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.
;