可能只是我,但是......尽管大多数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
,但任何提交
CONVERT
文档或
varchar
是受欢迎的。只要你不仅仅是过度不愉快,因为在所有对MS的批评中,总会有那些MS粉丝在衣领下变热......:|
答案 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):
Smallint存储2个字节,从“ -32768”到“ 32767”,需要varchar(6): -5个字符的数字 -1个减号字符
不确定是否需要用于数千个分隔符的字符,或者是否可以通过设置更改它。