Microsoft T-SQL:我可以将smallint转换为varchar

时间:2016-04-21 15:52:19

标签: sql-server tsql sql-convert

可能只是我,但是......尽管大多数sql开发人员可能会考虑使用cast&转换为非常基本的东西,这可能是真的,我在CAST& amp;上找到了微软的文档页面。 CONVERT是我见过的最丑陋,不直观,难以理解的事情之一。他们的大部分文档都很棒。就像不断尝试将整个页面融合到演员和转换的混合中,在每个句子中来回跳跃......而不是单独处理它们。谁将target_type作为第一个参数?将表达式作为第一个参数将更直观 - 并遵循其他99%的众多编程语言的语法。 UH

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

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

暂时搁置我一直在尽可能多地使用其他数据类型(date,varchar)的事实,

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

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

最后,我想运行一个INSERT来获取smallint并将其放入varchar(200)列。

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

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

    1. 如何安全地将其转换为插入varchar
    2. 是受欢迎的。只要你不仅仅是过度不愉快,因为在所有对MS的批评中,总会有那些MS粉丝在衣领下变热......:|

2 个答案:

答案 0 :(得分:1)

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

  

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

这可能是对数据类型普遍缺乏了解的产物,它们如何从一种类型转换为另一种类型,同样重要; 数据类型的美学表示方式是什么样式。

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

文件明确指出:

  

隐含转化

     

隐式转化是指没有转化的转化   指定CAST或CONVERT函数。明确的转换   是那些需要CAST或CONVERT函数的转换   指定。下图显示了所有显式和隐式   SQL Server系统提供的数据类型转换   数据类型。这些包括xml,bigint和sql_variant。没有   从sql_variant数据类型赋值的隐式转换,但是   有隐式转换为sql_variant。

关于你的第二个问题

  

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

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

文件明确指出:

  

截断和舍入结果

     

转换字符或二进制表达式时(char,nchar,   nvarchar,varchar,binary或varbinary)到a的表达式   不同的数据类型,数据可以被截断,只能部分显示,   或者返回错误,因为结果太短而无法显示。   转换为char,varchar,nchar,nvarchar,binary和varbinary   被截断,但以下所示的转换除外   表

换句话说,铸造永远不会安全。

答案 1 :(得分: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个减号字符

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