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

What is the easiest way using T-SQL / MS-SQL to append a string to existing table cells?

提问人:Matt Mitchell 提问时间:8/20/2008 最后编辑:ConcernedOfTunbridgeWellsMatt Mitchell 更新时间:7/22/2012 访问量:25708

问:

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

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

sql sql-server t-sql

评论


答:

27赞 Matt Mitchell 8/20/2008 #1

解决方案是:

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

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

评论

1赞 Mark Cidade 8/20/2008
var char 值是否在表达式中包含空格或仅包含固定长度的 char 字段?
0赞 Matt Mitchell 8/21/2008
我不确定 - 我正在使用的字段是 varchar(50),它包括间距,我同意这似乎与 varchar 的想法背道而驰。也许有人可以启发我们为什么 varchar 在选择时包含空格?
0赞 Nielsvh 11/16/2016
如果您的列将数据作为 char(50) 字段并更改为 varchar(50),则多余的空格将保留。
4赞 Matt Hamilton 8/20/2008 #2

我认为很容易。

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

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

6赞 samjudson 8/20/2008 #3

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

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

评论

0赞 Matt Mitchell 8/21/2008
我不确定 - 我正在使用的字段是 varchar(50),它包括间距,我同意这似乎与 varchar 的想法背道而驰。也许有人可以启发我们为什么 varchar 在选择时包含空格?
1赞 Amy B 9/17/2008 #4

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

人生教训:永远不要使用字符。

评论

0赞 Matt Mitchell 2/27/2009
啊!这是使用 SQL 导入工具的 Excel 导入
1赞 Ricardo C 9/17/2008 #5

尾随空间之谜的答案可以在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.

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

1赞 Dr8k 9/17/2008 #6

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