【问题标题】:Conversion issue when using Substring in SQL Server在 SQL Server 中使用子字符串时的转换问题
【发布时间】:2020-04-05 07:48:10
【问题描述】:

我正在尝试根据某些条件使用同一数据表中的其他列值更新列值(检查字段末尾是否有 .pdf)。在更新列值时,我必须删除 .pdf,然后使用 SUBSTRING() 进行分配。

Update Table_name
Set col_1 = SUBSTRING(col_2, 1, LEN(col_2 - 4))
Where col_2 like '%.pdf%'

但我得到一个错误

将 nvarchar 值 default.pdf 转换为数据类型 int 时转换失败

注意:col_1col_2 都是 nvarchar(255) 类型

【问题讨论】:

  • 我尝试了 CONVERT 和 CAST over SUBSTRING() 但同样的问题
  • 为什么要在列中的任何位置搜索“.pdf”。您的逻辑基于字符串以 .pdf 结尾的假设,因此请保持您的陈述一致!思考!你应该有where col_2 like N'%.pdf'; 你的专栏是nvarchar 吗?然后使用 unicode 文字。

标签: sql-server substring


【解决方案1】:

您的 LEN 计算存在语法错误。 LEN(col_2) - 4) 而不是 LEN(col_2 - 4)

SQL 正在尝试将 col_2 转换为 INT 以在应用 LEN 函数之前首先计算 col_2 - 4。首先,获取返回 INT 的 LEN(col_2),然后减去 2。

解决方案:

UPDATE Table_name
   SET col_1 = SUBSTRING(col_2, 1, LEN(col_2) - 4)
 WHERE col_2 LIKE '%.pdf%'

【讨论】:

    【解决方案2】:

    虽然您的代码有轻微的语法错误。应该是

    SUBSTRING(col_2, 1, LEN(col_2) - 4)要更新的列的值。

    您也可以使用charindex()Reverse() 函数进行尝试,如下所示。

    create table MyTable
    (
      col_1 nvarchar(255)
      , col_2 nvarchar(255)
    )
    
    insert into MyTable values
    (null, 'ABC.pdf'),(null, 'MNO.pdf'),(null, 'PQR.pdf')
    
    select * from MyTable
    
    UPDATE MyTable
    SET col_1 = left([col_2], len([col_2]) - charindex('.', Reverse([col_2])))
    WHERE col_2 LIKE '%.pdf%'
    
    select * from MyTable
    

    直播db<>fiddle演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多