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

StackOverflow https://stackoverflow.com/questions/17624

  •  09-06-2019
  •  | 
  •  

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

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

有帮助吗?

解决方案

解决办法是:

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

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

其他提示

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

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

我认为这很简单。

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

编辑:哦,对@MattMitchell 对 rtrim 建议的回答+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

生命的教训 :切勿使用字符。

我想调整David B的“Life Lesson”。我认为应该是“永远不要将 char 用于可变长度字符串值”-> char 数据类型有有效的用途,只是没有一些人想象的那么多:)

尾随空格之谜的答案可以在 ANSI_PADDING 中找到

欲了解更多信息,请访问: 设置 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.

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top