【问题标题】:SQL Server - Insert SelectSQL Server - 插入选择
【发布时间】:2014-10-26 18:54:44
【问题描述】:

我有一个查询,我试图选择另一行的内容并将其插入表中,但会更改特定值。在这里面,我试图使用Replace() 函数来替换给定列中的某些字符。

这是正确的还是我需要通过Update 声明将其取出并执行此操作?

这是我的 SQL 语句:

INSERT INTO [dbo].[PurchaseLogic]
       ([column1]
       ,[column2]
       ,[column3]
       ,[column4])
SELECT  [column1]
       ,[column2]
       ,replace(column3, 'TextA','TextB')
       ,[column4]
FROM dbo.purchaselogic 
WHERE column1 = 1

汉克斯

编辑

对不起,这是我执行时遇到的错误:

参数数据类型文本对于替换函数的参数 1 无效。

【问题讨论】:

  • 看起来正确。你有什么问题吗?
  • 这将起作用,因为您的替换是在您的选择语句中调用的。
  • 错误在哪里??????你首先要什么???
  • 您要替换数据库中的值还是只替换返回值?
  • ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)See details here(似乎您的 column3text 类型 - 将其更改为 varchar(max) 以便能够使用所有常用的字符串函数!)

标签: sql sql-server


【解决方案1】:

这对我来说看起来是正确的,应该做你想做的事。但是,您是否有某些原因无法自己尝试并检查结果?

如果 Column3 是“文本”的数据类型,这将不起作用,因为替换不适用于该数据类型。您可以将数据类型转换为 nvarchar(max) 来完成这项工作。例如:

Replace(Cast(column3 as varchar(max)),'TextA','TextB')

【讨论】:

    【解决方案2】:
    INSERT INTO [dbo].[PurchaseLogic]
           ([column1]
           ,[column2]
           ,[column3]
           ,[column4])
    SELECT  [column1]
           ,[column2]
           ,CAST(REPLACE(CAST(column3 as Varchar(MAX)),'TextA','TextB') AS Text)
           ,[column4]
    FROM dbo.purchaselogic 
    WHERE column1 = 1
    

    我明白了它的精髓here

    【讨论】:

      【解决方案3】:

      column3 是TEXT 列,您需要将其转换为VARCHAR(MAX) 才能使用REPLACE 函数:

      INSERT INTO [dbo].[PurchaseLogic]
             ([column1]
             ,[column2]
             ,[column3]
             ,[column4])
      SELECT  [column1]
             ,[column2]
             ,REPLACE(CAST(column3 AS VARCHAR(MAX)), 'TextA','TextB')
             ,[column4]
      FROM dbo.purchaselogic 
      WHERE column1 = 1
      

      【讨论】:

        【解决方案4】:
        INSERT INTO [dbo].[PurchaseLogic]
               ([column1]
               ,[column2]
               ,[column3]
               ,[column4])
        SELECT  [column1]
               ,[column2]
               ,cast(replace(cast(column3 as nvarchar(max)),'TextA','TextB') as ntext)
               ,[column4]
        FROM dbo.purchaselogic 
        WHERE column1 = 1
        

        【讨论】:

        • 如果column3TEXT,您不应该将其转换为NVARCHAR(MAX)(而应使用varchar(max)
        • 是的,你是对的@marc_s..我们不知道确切的数据..无论如何都要记下来...
        • 我们知道确切的数据类型 - 错误消息清楚地表明它的类型是text(非Unicode)......
        【解决方案5】:

        上面介绍的各种解决方案应该可以使查询工作,但如果您要定期执行此类操作,您至少应该考虑从源头解决问题并更改 [dbo] 的数据类型。[ PurchaseLogic].[column3] 到 VARCHAR(MAX)

        您可以使用 ALTER TABLE 命令位来做到这一点,我可能会通过创建一个新表并将数据插入其中来做到这一点

         CREATE TABLE [dbo].[PurchaseLogic_new]
         (
         [column1] int,
         [column2] int,
         [column3] varchar(max),
         [column4] int
         )    
         INSERT INTO dbo.PurchaseLogic_new ([column1],[column2],[column3],[column4] )
         SELECT [column1],[column2],[column3],[column4]  FROM [dbo].[PurchaseLogic]
        

        完成后,您可以交换名称

         EXEC sp_rename 'dbo.PurchaseLogic','PurchaseLogic_old','OBJECT'
         EXEC sp_rename 'dbo.PurchaseLogic_new','PurchaseLogic','OBJECT'
        

        然后您可以通过交换名称来取消更改

         EXEC sp_rename 'dbo.PurchaseLogic','PurchaseLogic_new','OBJECT'
         EXEC sp_rename 'dbo.PurchaseLogic_old','PurchaseLogic','OBJECT'
        

        【讨论】:

          猜你喜欢
          • 2014-10-05
          • 1970-01-01
          • 1970-01-01
          • 2013-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多