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

时间:2008-08-20 08:52:00

标签: sql sql-server tsql

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

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

6 个答案:

答案 0 :(得分:26)

解决方案是:

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

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

答案 1 :(得分:5)

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

如果您在没有RTRIM功能的CHAR字段上尝试它,您将得到“字符串或二进制数据将被截断”错误。

答案 2 :(得分:2)

我认为很容易。

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

编辑:对@t MattMitchell提出rtrim建议的回答+1。

答案 3 :(得分:1)

如果原始数据来自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。

答案 4 :(得分:1)

可以在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.

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

答案 5 :(得分:1)

我想调整David B的“生活课”。我认为它应该“永远不要使用char作为可变长度的字符串值” - > char数据类型有一些有效的用途,但不像有些人想的那么多:)