使用T-SQL / MS-SQL将字符串添加到现有表单元格的最简单方法是什么?

时间:2020-03-05 18:41:01  来源:igfitidea点击:

我有一个带有"文件名"列的表。
我最近在此列中执行了插入操作,但是我匆忙忘了将文件扩展名添加到所有输入的文件名中。幸运的是,它们都是" .jpg"图像。

如何轻松更新这些插入字段的"文件名"列(假设我可以根据已知的ID值选择最近的行)以包括" .jpg"扩展名?

解决方案

回答

解决方案是:

UPDATE tablename SET [filename] = RTRIM([filename]) + '.jpg' WHERE id > 50

要求使用RTRIM,因为否则整个[filename]列将被选择用于字符串连接,即,如果它是varchar(20)列且文件名只有10个字母长,那么它将仍然选择那10个字母,然后选择10个空格。当我们尝试将20 + 3个字符放入20个字符长的字段中时,这将导致错误。

回答

我认为很简单。

update MyTable
set filename = filename + '.jpg'
where ...

编辑:哦+1对@MattMitchell的rtrim建议答案。

回答

如果列是CHAR(20),MattMitchell的答案是正确的,但是如果列是VARCHAR(20)并且未明确输入空格,则答案不正确。

如果我们在不带RTRIM功能的CHAR字段上尝试使用它,则会收到"字符串或者二进制数据将被截断"错误。

回答

如果原始数据来自char列或者变量(在插入此表之前),则原始数据在变为varchar之前已添加空格。

DECLARE @Name char(10), @Name2 varchar(10)
SELECT
  @Name = 'Bob',
  @Name2 = 'Bob'

SELECT
  CASE WHEN @Name2 = @Name THEN 1 ELSE 0 END as Equal,
  CASE WHEN @Name2 like @Name THEN 1 ELSE 0 END as Similiar

生活课:永远不要使用char。

回答

尾随空格的奥秘可以在ANSI_PADDING中找到

有关更多信息,请访问:SET ANSI_PADDING(Transact-SQL)

默认值为ANSI_PADDIN ON。这将仅在创建列时影响列,而不会影响现有列。

在运行更新查询之前,请验证数据。它可能已经被妥协了。

运行以下查询以查找受损的行:

SELECT *
FROM tablename 
WHERE LEN(RTRIM([filename])) > 46 
-- The column size varchar(50) minus 4 chars 
-- for the needed file extension '.jpg' is 46.

这些行丢失了一些字符,或者没有足够的空间来添加文件扩展名。

回答

我想调整David B的"生活课"。我认为应该是"永远不要将char用于可变长度的字符串值"-> char数据类型有有效的用途,只是不如某些人想像的那么多:)