使用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数据类型有有效的用途,只是不如某些人想像的那么多:)