我发现这是一种真正奇怪的行为。
这是我的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的任何地方进行过测试),接着是' D'它就会失败,而#39 ;将数据类型varchar转换为数字时出错。'消息。
所有其他文字组合都有效。小写d很好。 C很好,E,F等等。所以' 17F5,A,1'很好。还有' asdf 17D5,A,1'很好。 '如图1D所示,A,1'不行。
我很困惑。在T-SQL中是否有特殊的转义字符用于' D'?
更新 我应该澄清错误发生在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并失败的原因。我可以在该函数中添加一个额外的检查来首先降低文本,看看它是否也是数字。
答案 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