我有一个带有'filename'列的表。 我最近在此列中执行了插入操作,但在我的仓促中忘记将文件扩展名附加到输入的所有文件名中。幸运的是,它们都是'.jpg'图像。
如何轻松更新这些插入字段的“文件名”列(假设我可以根据已知的id值选择最近的行)以包含“.jpg”扩展名?
答案 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数据类型有一些有效的用途,但不像有些人想的那么多:)