'<number> D'导致CAST错误</number>

时间:2015-03-18 20:21:27

标签: sql-server

我发现这是一种真正奇怪的行为。

这是我的T-SQL:

declare @testText nvarchar(1000);
set @testText = '17D4,A,1';
select txt_value from fn_ParseText2Table (@testText , ',' )

其中fn_ParseText2Table是一个函数,它将文本解析为一个表,您可以在其中获取txt,int和浮点值(如果它们有效)。 17D4是我试图在更大的查询中提取的产品代码,所有其他3817记录都可以正常工作。

select (
     select txt_value 
     from fn_ParseText2Table(t.primaryKeyValues , ',' ) as pk 
     where position = 1) as product_NBR 
from database.dbo.tablesToParse as t 
where t.tableName = 'ProductData'

我找到了函数here

我发现,如果字符串以某些数字开头(我已经在1-4的任何地方进行过测试),接着是&#39; D&#39;它就会失败,而#39 ;将数据类型varchar转换为数字时出错。&#39;消息。

所有其他文字组合都有效。小写d很好。 C很好,E,F等等。所以&#39; 17F5,A,1&#39;很好。还有&#39; asdf 17D5,A,1&#39;很好。 &#39;如图1D所示,A,1&#39;不行。

我很困惑。在T-SQL中是否有特殊的转义字符用于&#39; D&#39;?

更新  我应该澄清错误发生在fn_ParseText2Table()

更新2 它的SQL服务器10 - 64位,在Windows 2008服务器上运行。

同样,我已经在sql mgr查询窗口中对此进行了测试:

declare @testText nvarchar(1000);
set @testText = '17D4';
select isnumeric( @testText )

IsNumeric()调用返回1,这就是fn_ParseText2Table()函数尝试将其强制转换为in并失败的原因。我可以在该函数中添加一个额外的检查来首先降低文本,看看它是否也是数字。

1 个答案:

答案 0 :(得分:1)

我认为它与浮点文字有关,但我很惊讶它不会转换为数字类型。我想这只有在float是目标类型时才有效。你会在这里找到解释:

http://www.sqlservercentral.com/Forums/Topic202581-8-1.aspx

此行为与其他SQL Server文字不匹配,即常量:

select 1d -- literal 1 with d treated as the column alias
select 1e -- literal 1.0 as a float
select cast('1d' as float), cast('1e' as float) -- neither of these will cast without an exponent value

select cast('1d0' as float), cast('1e0' as float) -- these work though