【问题标题】:UPDATE SET REPLACE function SQLUPDATE SET REPLACE 函数 SQL
【发布时间】:2019-11-22 21:30:28
【问题描述】:

在 SQL 中使用 REPLACE 函数时不断出错,我不知道为什么?

我执行这个查询:

UPDATE [ShellPlus].[dbo].[Views]
SET [ShellPlus].[dbo].[Views].SerializedProperties = REPLACE(SerializedProperties,'|EKZ PSG met verkort EEG','|EKZ PSG met verkort EEG|EEG kort op EEG3')  
WHERE [ShellPlus].[dbo].[Views].InternalViewID = '3F4C1E8E-DA0C-4829-B447-F6BDAD9CD505'

我不断收到这条消息:

消息 8116,第 16 级,状态 1,第 6 行 参数数据类型 ntext 对于替换函数的参数 1 无效。

  • 在更新时,我给出了正确的表格
  • 在 SET 我给出了正确的列
  • 在 REPLACE 我给出:(列名,'旧字符串','新字符串')

我做错了什么?

【问题讨论】:

  • 错误告诉你问题。为什么你还在使用ntext?它已被弃用近 15 年。
  • 此外,使用 3+ 部分命名(在您的情况下为 4 部分)引用列名也已被弃用,应避免使用。你的代码有一天会停止工作。
  • @GarethD 虽然这是一个明显的重复,但您链接到的帖子中的答案都没有给出解决方案或解释问题 - 您得到的最好的是一种解决方法。这就是我撤销你重复投票的原因。

标签: sql-server tsql sql-update


【解决方案1】:

真正的解决方案是修复数据类型:

USE ShellPlus;

ALTER TABLE [dbo].[Views] ALTER COLUMN SerializedProperties nvarchar(MAX);

那么您现有的查询将起作用。但你也应该规范化这些数据。

【讨论】:

    【解决方案2】:

    试试这个:

    UPDATE [ShellPlus].[dbo].[Views]
    SET [ShellPlus].[dbo].[Views].SerializedProperties = CAST(REPLACE(CAST(SerializedPropertiesas NVarchar(MAX)),'|EKZ PSG met verkort EEG','|EKZ PSG met verkort EEG|EEG kort op EEG3') ) AS NText)
    WHERE [ShellPlus].[dbo].[Views].InternalViewID = '3F4C1E8E-DA0C-4829-B447-F6BDAD9CD505'
    

    【讨论】:

    • 你真的应该摆脱那个 4 部分的列命名。
    • 虽然此解决方法可能会帮助 OP 摆脱错误消息,但这绝不是问题的解决方案 - OP 遇到的错误只是实际问题的症状,它是Text数据类型的用法。
    【解决方案3】:

    你至少做错了三件事:

    1. 您似乎将分隔数据存储在列中 - 这是一个错误。欲了解更多信息,请阅读Is storing a delimited list in a database column really that bad?,您会在其中看到很多理由说明为什么这个问题的答案是绝对是的!

    2. 您正在使用 Text 数据类型,自 SQL Server 2008 引入 varchar(max) 来替换它以来,该数据类型已被弃用。鉴于我们在 2019 年,而 2008 版本刚刚结束,它在今年 7 月提供了扩展支持,现在是时候将 Text 数据类型更改为 varchar(max) 了(如果您使用的是 2008 或 2008 r2 版本,升级您的 SQL Server)。

    3. 您正在为列名使用四部分标识符(感谢@Larnu 在 cmets 中指出这一点)。最佳实践是对列名使用两部分标识符。阅读my answer here了解详细说明。

    您的问题的解决方案涉及重构数据库结构 - 规范化需要规范化的内容,并将所有 TextNTextImage 替换为其现代替换数据类型:varchar(max)nvarchar(max)varbinary(max)。此外,这将是确定您是否真的需要支持超过 8000 个字符的值(对于 unicode 值是 4000 个)的好时机,如果不需要,请使用更合适的值(max 长度列与“常规”相比性能较差" 长度列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多