-1

可能只是我,但是......尽管大多数 sql 开发人员可能认为 cast & convert 是非常基本的东西,这可能是真的,但我发现微软关于 CAST & CONVERT 的文档页面是最可怕的页面之一,不直观的布局,很难理解我见过的东西。他们的许多文档都很棒。就像不断尝试将整个页面混合成演员和转换的混合体,在每个句子中来回跳跃......而不是单独处理它们。谁将 target_type 作为第一个参数?将表达式作为第一个参数会更直观 - 并遵循其他 99% 的众多编程语言的语法。呃

MS说我只能转换为3种数据类型:(实际上我不确定这是否适用于CAST和CONVERT,因为它们实际上是不同的......但根据该网页的布局,它显然同样适用于两者——尽管我已经知道它不适用于 CAST,我更频繁地使用它)。

它说:“是目标数据类型。这包括 xml、bigint 和 sql_variant”

暂且不说我一直 CAST 的东西和其他许多数据类型一样(日期,varchar),

我的直接问题是:如果我只能转换为这些数据类型,那么为什么会这样呢?

select CONVERT(varchar(200), cast(50 as smallint))

最后,我想运行一个INSERT将得到 asmallint并将其放入varchar(200)列中的方法。

我要做的就是避免任何失败,所以也许我真的“不需要”转换或转换为varchar,但任何评论

  1. 回答我对CONVERT文档的明显误解

或者

  1. 如何安全地将其转换为插入varchar

受欢迎的。只要你不只是过分不愉快,因为总是有那些 MS 粉丝在所有对 MS 的批评中都发火 .. :|

4

2 回答 2

2

是的,您可以从smallint转换为varchar

1)回答我对 CONVERT 文档的明显误解

这可能是由于普遍缺乏对什么是数据类型、如何将它们从一种类型转换为另一种类型以及同样重要的理解的产物;当涉及到数据类型的美学表示时,样式是什么。

CAST 是没有样式选项的显式转换操作。CONVERT 也是一种显式转换它使您能够为输出指定样式。

该文件明确指出:

隐式转换

隐式转换是在未指定 CAST 或 CONVERT 函数的情况下发生的转换。显式转换是那些需要指定 CAST 或 CONVERT 函数的转换。下图显示了 SQL Server 系统提供的数据类型所允许的所有显式和隐式数据类型转换。这些包括 xml、bigint 和 sql_variant。从 sql_variant 数据类型的赋值没有隐式转换,但有到 sql_variant 的隐式转换。

对于你的第二个问题

2)如何安全地将其转换为插入到varchar

取决于您所说的安全。转换为 varchar 是最有可能成功的转换。但是,无论何时转换为任何数据类型,您本质上都会改变数据的本质,并且在转换为较小的类型(或应用样式)时会失去精度。

该文件明确指出:

截断和舍入结果

将字符或二进制表达式(char、nchar、nvarchar、varchar、binary 或 varbinary)转换为不同数据类型的表达式时,可能会截断数据、仅显示部分数据,或者由于结果太短而返回错误显示。到 char、varchar、nchar、nvarchar、binary 和 varbinary 的转换将被截断,下表中显示的转换除外。

换句话说,铸造从来都不是安全的。

于 2016-04-21T17:13:07.063 回答
0

对我来说,数字总是被默默地截断。我建议:

选项1

将转换后的值与原始值进行比较。

DECLARE @ORIGINAL DECIMAL(13,2) = -99999999999.99 -- 
DECLARE @EXPECTED VARCHAR(15) = ''
SELECT @EXPECTED = CONVERT(VARCHAR(15),@ORIGINAL)
IF CONVERT(DECIMAL(13,2),@EXPECTED) != @ORIGINAL SELECT 'Ooops'

选项 2

确保所有可能的值都适合目标 varchar。

十进制 (13,2)。可能的最大数字是“-99999999999.99”需要 varchar(15):

  • 13个字符的数字
  • 1 个字符用于小数分隔符
  • 减号 1 个字符

Smallint 存储 2 个字节,从“-32768”到“32767”,需要 varchar(6): - 5 个字符用于数字 - 1 个字符用于减号

不确定是否需要千位分隔符的字符,或者是否可以通过设置更改它。

于 2020-02-17T12:23:06.057 回答