sqlserver更新修复列值

时间:2017-06-30 09:25:56

标签: sql sql-server tsql sql-insert

表ta的栏目如下:

A,B,C

然后我将列d添加到表ta(下面代码的列d值回复以生成)

select a+'-'+ rtrim(b) +'-'+ cast(row_number() over(order by a) as varchar) +'-tanew' as d  from main 

我试图插入,但它将覆盖列a,b,c中的exsits值。我该如何保持a,b,c的原始数据并插入d,就像上面显示的代码一样?

非常感谢!

这是我案例的最终解决方案:

update ta set d = [a] +'-' + rtrim([b]) + [c] + '-tanew'  

3 个答案:

答案 0 :(得分:0)

如果您使用ssms,请尝试:::

alter table main
add d varchar(max)
update main
set d =
(select a+'-'+ rtrim(b) +'-'+ cast(row_number() over(order by a) as varchar) +'-tanew'  from main )

--i assume col a and b are already in varchar format

答案 1 :(得分:0)

您不应创建和更新row_number值的列。 插入或删除行或更新列a

时,此列很难维护

只需使用视图

CREATE VIEW dbo.YourViewName AS
(
   SELECT *,
       concat(a,'-', b,'-', row_number() over(ORDER BY Name)) AS d 
 FROM dbo.YourTable t
)

并选择数据

SELECT * FROM dbo.YourViewName vt

注意:

  • Row_number仅用于order byselect子句
  • 如果你是 使用SQL 2012+,您可以使用concat作为和字符串。

答案 2 :(得分:0)

在SQL Server中,您将使用可更新的CTE:

with toupdate as (
      select t.*,
             (a + '-' + rtrim(b) + '-' + cast(row_number() over (order by a) as varchar(255)) + '-tanew'
             ) as new_d 
      from main
     )
update toupdate
    set d = new_d;

注意:每当您使用varchar()时,总是包含一个长度。 SQL Server根据上下文将长度默认为不同的值。由此类默认值引起的错误很难调试。