我正在尝试将此查询从Access数据库转换为在SQL Server 2008中工作并且卡住了。我知道存在差异,但我不确定发生了什么,显然我不是很擅长这一点。 任何帮助将不胜感激。
使用
Mid(Trim([SC01039]),
InStrRev(Trim([SC01039])," ")+3,4)
AS ProductType
SQL Server 2008 (这是我尝试将其更改为)
Substring(RTrim(LTrim([SC01039])),
Right(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039]))))+3,4)
AS ProductType
我收到的错误是
“将nvarchar值'L318'转换为数据时转换失败 输入int。“
为什么要尝试将生成的文本转换为整数?我的假设是查询说:“找到最接近字符串右边的空格的位置,现在将3添加到该位置并给我接下来的4个字符。”这似乎是数据的问题,而不是查询(如果没有空格它会怎么做?或者字符串是空的?)我不知道......
我接近了吗? :P
SC01039中有混合字符,但这是一个示例:
SC01039 : Expected Output
------------- : ---------------
QC 06999911 : 9999
SW 12FMT116 : FMT1
26RMF399 : RMF3
08 : [empty]
[empty] : [empty]
显然它总是4个字符,从找到的第一个空格的右边开始3(从右到左搜索空格)。 SC01039中的一些数据有多个空格(即:09 TVR 012 2,在这种情况下它不返回任何内容,我相信没问题。)
答案 0 :(得分:0)
问题在于代码的Right(RTrim(LTrim([SC01039])),
部分。你为什么需要它?因为我在下面展示的应该可以解决问题。
试试这个:
Substring(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039])))+3,4)
AS ProductType
Substring期待SUBSTRING(expression, start, length)
并且你提供了第二个带有nvarchar的参数;
Right(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039]))))+3
因此你的错误。
创建此功能(您无需将其放在可读性方面
)CREATE FUNCTION InStrRev(@Val nvarchar(max), @substr nvarchar(max))
RETURNS int
AS
BEGIN
RETURN CASE WHEN CHARINDEX(@substr, RTrim(LTrim(Reverse(@Val)))) = 0 THEN 0 ELSE LEN(@Val) - CHARINDEX(@substr, RTrim(LTrim(Reverse(@Val)))) + 1 END -- add one because you want a start position
END
并在您的代码中使用它
Substring(RTrim(LTrim([SC01039])), dbo.InStrRev([SC01039], ' ') + 3, 4) AS ProductType
希望有所帮助