【问题标题】:What is the easiest way using T-SQL / MS-SQL to append a string to existing table cells?使用 T-SQL / MS-SQL 将字符串附加到现有表格单元格的最简单方法是什么?
【发布时间】:2010-09-06 06:24:50
【问题描述】:

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    解决办法是:

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

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

    【讨论】:

    • varchar 值是否包含表达式中的空格或仅包含固定长度的 char 字段?
    • 我不确定 - 我正在使用的字段是 varchar(50) 并且它包含间距,我同意这似乎与 varchar 的想法相悖。也许有人可以启发我们为什么选择 varchar 时包含空格?
    • 如果您的列有数据作为 char(50) 字段并更改为 varchar(50),则多余的空格将结转。
    【解决方案2】:

    我认为这很容易。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我不确定 - 我正在使用的字段是 varchar(50) 并且它包含间距,我同意这似乎与 varchar 的想法相悖。也许有人可以启发我们为什么选择 varchar 时包含空格?
      【解决方案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
      

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

      【讨论】:

      • 啊!这是使用 SQL 导入工具进行的 Excel 导入
      【解决方案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.
      

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-06-02
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多