访问查询与 SQL Server 2008 查询
Access query vs SQL Server 2008 query
我试图将此查询从 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
我收到的错误是
"Conversion failed when converting the nvarchar value 'L318' to data
type int."
为什么要尝试将生成的文本转换为整数?我的假设是查询是说,"Find the position of the space closest to the right of the string, now add 3 to that position and give me the next 4 characters." 这似乎是数据的问题,而不是查询(如果没有 space,它会做什么?或者字符串为空?)我不知道...
我什至接近了吗? :P
SC01039 中有混合字符,但这是示例:
SC01039 : Expected Output
------------- : ---------------
QC 06999911 : 9999
SW 12FMT116 : FMT1
26RMF399 : RMF3
08 : [empty]
[empty] : [empty]
显然它总是 4 个字符,从找到的第一个 space 的右侧开始第 3 个字符(从右到左搜索 space)。 SC01039 中的一些数据有多个 space(即:09 TVR 012 2,在这种情况下它没有 return 任何东西,我相信这没问题)。
您的问题出在代码的 Right(RTrim(LTrim([SC01039])),
部分。你为什么需要它?因为我在下面展示的内容应该可以解决问题。
试试这个:
Substring(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039])))+3,4)
AS ProductType
子字符串需要 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
希望对您有所帮助
我试图将此查询从 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
我收到的错误是
"Conversion failed when converting the nvarchar value 'L318' to data type int."
为什么要尝试将生成的文本转换为整数?我的假设是查询是说,"Find the position of the space closest to the right of the string, now add 3 to that position and give me the next 4 characters." 这似乎是数据的问题,而不是查询(如果没有 space,它会做什么?或者字符串为空?)我不知道...
我什至接近了吗? :P
SC01039 中有混合字符,但这是示例:
SC01039 : Expected Output
------------- : ---------------
QC 06999911 : 9999
SW 12FMT116 : FMT1
26RMF399 : RMF3
08 : [empty]
[empty] : [empty]
显然它总是 4 个字符,从找到的第一个 space 的右侧开始第 3 个字符(从右到左搜索 space)。 SC01039 中的一些数据有多个 space(即:09 TVR 012 2,在这种情况下它没有 return 任何东西,我相信这没问题)。
您的问题出在代码的 Right(RTrim(LTrim([SC01039])),
部分。你为什么需要它?因为我在下面展示的内容应该可以解决问题。
试试这个:
Substring(RTrim(LTrim([SC01039])),
CHARINDEX(' ',RTrim(LTrim([SC01039])))+3,4)
AS ProductType
子字符串需要 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
希望对您有所帮助