什么是T-SQL中游标的最佳替代?

时间:2017-03-21 11:36:03

标签: sql sql-server cursor

我有一个设计问题,我需要在不使用游标的情况下实现。

源表'A'将包含varchar数据类型中的所有列。我想迭代它们并将每列转换为目标表数据类型,如果转换/解析失败,我需要在额外的错误表中记录该行。

任何建议都会有所帮助。

3 个答案:

答案 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作为类型)