【问题标题】:How to "TryCast" data in sql如何在 sql 中“TryCast”数据
【发布时间】:2011-12-10 10:09:49
【问题描述】:

Table1 有数据要导入 Table2。 Table1 仅包含 varchar 字段,但它们将被强制转换为它们将在 Table2 中导入的任何字段的类型。

数据必须一次导入一行,所以我可以捕获异常以找出导致问题的行,但这并不能告诉我哪一列是罪魁祸首,以及是否有很多异常比它慢不仅仅是提前检查有效数据(更不用说我希望能够在开始导入过程之前解决问题......最好不必实际进行事务并将其回滚以找出问题所在) .

理想情况下,我想做这样的事情:

select RowNumber from table where cast(fieldName as SomeDataType) = 0

显然,该语句没有意义,因为这不是 cast 所做的,但我的想法是我想要一个尝试转换数据并根据转换是否成功返回 true 或 false 值的函数.

有没有一些我忽略的简单方法?

【问题讨论】:

  • 澄清一下,一个名为 RowNumber 的列,所以我不问这部分。

标签: c# sql sql-server


【解决方案1】:

相关帖子:

MS SQL server casting without exception

How do I TryParse in SQL 2000?

您可能最终需要编写一个用户定义的函数来组合几种不同的方法来尝试强制转换。由于它是进口产品,我假设性能不是最受关注的问题。调用 UDF 减慢进程。

您也可以尝试编写 CLR 存储过程并使用 .NET 类型检查和转换来至少对您的数据进行广泛分类(由于 .NET 和 T-SQL 之间的类型差异,可能难以准确分类)。

【讨论】:

  • 是的,我的第一个倾向是查看目标数据类型是日期还是数字类型,并使用 IsNumeric/IsDate 在源列中查找无效数据,因为我认为这可能足以满足我的需求应用程序。但似乎应该有一种内置的方式在 sql 中执行此操作。听起来好像没有。
  • 至于速度,对于多达 20k 行的数据,它确实需要相当快。这个想法是用户选择要导入的文件,下面的数据网格会拉出任何异常行供他们在导入之前进行编辑。
  • @Brandon Moore - 为什么不在尝试插入记录之前解析内存中的数据文件以查找基本验​​证错误?这样,您可以避免访问数据库(除非您需要查找值以进行额外验证)并向用户呈现丰富的结构化返回值。这应该会减少在数据库中花费的时间,这可能会在冗长的导入过程中减少表锁定。
  • 锁定不是问题。完成后将不会打开任何其他连接。因此,我使用代码为源数据中的每一列发送一个查询,以根据目标数据类型查找无效数据。我也可以按照您建议的方式进行操作,但我认为让 sql 进行查找会更快(尚未对其进行标记,但到目前为止性能已经足够)。我只是希望有一个通用语句可以用于所有类型,而不必检查它是什么类型并根据该类型更改语句。
  • 不是我想要的答案,但看起来可能不存在更好的答案,所以我会把它给你 :)
猜你喜欢
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多