我有一个设计问题,我需要在不使用游标的情况下实现。
源表'A'将包含varchar
数据类型中的所有列。我想迭代它们并将每列转换为目标表数据类型,如果转换/解析失败,我需要在额外的错误表中记录该行。
任何建议都会有所帮助。
答案 0 :(得分:1)
在SQL Server中,您将使用try_convert()
:
insert into t2 ( . . . )
select . . .
from (select try_convert(?, col1) as col1,
try_convert(?, col1) as col2,
from staging_t
) t
where col1 is not null and col2 is not null and . . .;
然后运行第二个查询以获取值为NULL
的行。
如果NULL
是临时列中的允许值,那么这有点复杂:
insert into t2 ( . . . )
select new_col1, new_col2, . . .
from (select try_convert(?, col1) as new_col1, col1,
try_convert(?, col1) as new_col2, col2,
from staging_t
) t
where (new_col1 is not null or col1 is null) and
(new_col2 is not null or col2 is null) and
. . .;
答案 1 :(得分:0)
在Sql Server 2012及更高版本中:当转换失败而不是错误时,每个都会返回null
。
转换为int的所有varcharcol
的示例:
select id, varcharcol
from a
where try_convert(int,varcharcol) is null
答案 2 :(得分:0)
使用用户定义表类型
使用上方查询创建类型表 - 过程 - 用户定义表类型
@UserDefineTypeTable UserDefineTypeTable readonly
插入table1 COL1, COL2, col3
(选择
type.col1, type.col2, 型,COL3
来自@UserDefineTypeTable作为类型)