SQL中的更新查询中意外执行

时间:2015-01-27 16:27:14

标签: sql sql-server sql-server-2012 sql-update updates

我得到了一个意想不到的'结果与SQL Server 2012中的更新查询。 这就是我想要做的。

在由ID ','name(例如258967,Sarah Jones)组成的专栏(IDENTIFIER)中,我必须填写其他两列:IDSELLER_NAME

原始列有一些值,末尾有空白,其余的没有:

'258967,Sarah Jones'
'98745,Richard James '

这是我正在执行的更新查询:

UPDATE SELLER
SET 
IDENTIFIER = LTRIM(RTRIM(IDENTIFIER)),
ID = Left(IDENTIFIER , charindex(',', IDENTIFIER )-1),
SELLER_NAME = UPPER(RIGHT((IDENTIFIER ),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER )));

但我最后得到了错误的结果

258967,Sarah Jones    258967  SARAH JONES
98745,Richard James    98745   ICHARD JAMES

所有在末尾都有空白的名称也会发生同样的情况。在这一点上我想知道,如果我已经指定我想在IDENTIFIER的值的开头和结尾消除所有空白作为第一个动作,为什么系统更新ID和SELLER_NAMES然后执行此操作?

仅指定:IDENTIFIER列是卖家表的一部分,该表正在从另一个从Excel文件导入数据的人员进行更新。我收到这些值,我必须规范化信息。我只能阅读卖家表,在回答之前将其考虑在内

4 个答案:

答案 0 :(得分:4)

试试这个,因为你的名字右侧有空格,所以它只会截断名字中的一个字符。所以只需要RTRIM(IDENTIFIER)就可以了。

SELLER_NAME = UPPER(RIGHT((RTRIM(IDENTIFIER)),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER)));

答案 1 :(得分:1)

你的牌桌的设计违反了1NF,只不过是痛苦的。而不是做所有这些疯狂的字符串操作,你可以很容易地在这里利用PARSENAME。

with Something(SomeValue) as
(
    select '258967,Sarah Jones' union all
    select '98745,Richard James '
)

select *
    , ltrim(rtrim(PARSENAME(replace(SomeValue, ',', '.'), 2)))
    , ltrim(rtrim(PARSENAME(replace(SomeValue, ',', '.'), 1)))
from Something

答案 2 :(得分:0)

首先尝试修剪IDENTIFIER

SALLER_NAME = UPPER(RIGHT((RTRIM(IDENTIFIER),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER )));

答案 3 :(得分:0)

不使用Right(),而是使用SubString()

这是一个例子。我试图单独展示每一步来说明

; WITH x (identifier) AS (
  SELECT '258967,Sarah Jones'
  UNION ALL
  SELECT '98745,Richar James '
)
SELECT identifier
     , CharIndex(',', identifier) As comma
     , SubString(identifier, CharIndex(',', identifier) + 1, 1000) As name_only
     , LTrim(RTrim(SubString(identifier, CharIndex(',', identifier) + 1, 1000))) As trimmed_name_only
FROM   x

请注意,所使用的1000应该是列定义的最大长度或更高,例如如果您的IDENTIFIER列是varchar(2000),那么请改用2,000。