代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

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

  •  9
  • Matt Mitchell  · 技术社区  · 16 年前

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

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

    6 回复  |  直到 12 年前
        1
  •  25
  •   Matt Mitchell    16 年前

    解决方案是:

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

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

        2
  •  5
  •   Matt Mitchell    12 年前

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

    如果在不带rtrim函数的char字段上进行尝试,您将得到一个 “字符串或二进制数据将被截断” 错误。

        3
  •  2
  •   Matt Mitchell    12 年前

    我觉得很简单。

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

    编辑:ooh+1至@mattmitchell的RTRIM建议答案。

        4
  •  1
  •   Amy B    16 年前

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

    人生教训:永远不要用炭。

        5
  •  1
  •   Dr8k    16 年前

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

        6
  •  1
  •   Ricardo C    16 年前

    尾随空格的神秘性的答案可以在ansi_填充中找到。

    有关详细信息,请访问: 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.
    

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