gpt4 book ai didi

c# - 显式类型转换的好处?

转载 作者:太空宇宙 更新时间:2023-11-03 10:47:44 25 4
gpt4 key购买 nike

我正在处理一些由其他人编写的查询(在我看来),他们在调用 Convert() 时完全包装了所有内容。

这些查询从源数据库获取数据,然后 C# 程序将该数据(使用 System.Data.SqlClient.SqlBulkCopy)插入到目标数据库的表中。

所以,这是我所看到的事物类型的一个简短示例:

Select
Convert(nvarchar(50), t.Address1) as Address1
, Convert(smallint, case t.language_cd
when 'E' then 31
when 'N' then 32
when 'D' then 38
else 39
end) as LanguageID
from MyTable t

它正在转换以匹配目标表上的数据类型的数据类型(因此目标表上的 Address1 是 nvarchar(50),LanguageID 是 smallint)。源列 MyTable.Address1 是一个 varchar(60),对于 LanguageID,您可以看到我们正在将文字 31、32、38 和 39 转换为 smallint。

我的问题是:将每一列显式转换为与目标列匹配的数据类型是否有任何实际原因或优势?当然,将 varchar(60) 转换为 nvarchar(50) 可能会失败。但是将它包装在 convert() 中并不能阻止它失败。我想一个加号是,如果确实发生故障,某人一眼就能很容易地(在查询文件中)准确地看到我们正在尝试进行的转换。但对我来说,这似乎并不能证明查询文件中的所有这些困惑是合理的,尤其是丑陋的东西,比如在 Convert() 调用中嵌入 CASE 语句。另外,如果我们曾经更新目标数据库以将列加长到 60 个字符(可能是个好主意但在短期内不可行),那么我们将在 Convert() 调用和实际定义之间出现不匹配目标列。

那么,我是否遗漏了一些我不知道的从显式转换中获得的原因和好处?或者我的冲动是剥离这个查询并让转换隐式发生是一个好的查询?

最佳答案

Microsoft recommends使用 SqlBulkCopy 时,源和目标列类型匹配。根据 Internet,SqlBulkCopy 不像 INSERT .. SELECT 那样对不匹配的类型宽容。所以我认为在查询中进行转换是个好主意。

更不用说类型转换并不总是直截了当或一致的。例如,哪些数字转换是舍入的,哪些是截断的,并且 SQL Server 中的所有转换规则(这是执行 CONVERT 的地方,或者如果这是 INSERT .. SELECT 会发生转换的地方)与 SqlBulkCopy 相同(这与 INSERT .. SELECT 不同)?如果您不确切知道规则是什么,谨慎行事是明智的。

此外,如果查询中的类型转换失败,您可能会收到比批量插入失败时更有用的错误消息。如果您希望这些查询更易于管理,您可以这样写:

SELECT TOP (0)
CAST('' AS NVARCHAR(50)) AS Address1,
CAST(0 AS SMALLINT) AS LanguageID
UNION ALL
SELECT
t.Address1,
CASE t.language_cd
WHEN 'E' THEN 31
WHEN 'N' THEN 32
WHEN 'D' THEN 38
ELSE 39 END AS LanguageID
FROM MyTable t

这种重写很可能对查询优化没有影响(如果这是一个问题,请检查),虽然 TOP 不是标准 SQL,但代码是来自 CONVERT 而不是 CAST 的 T-SQL 特定的,所以它一开始就不是标准的。

这里的优点是查询的内容不杂乱,宣布和强制执行目标表列类型的查询部分是完全独立的,如果修改列类型,则很容易更改。

关于c# - 显式类型转换的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22800061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com