如何通过存储过程更改列名并更改表中的值?

Posted

技术标签:

【中文标题】如何通过存储过程更改列名并更改表中的值?【英文标题】:how to change column name and change a value in a table via a stored procedure? 【发布时间】:2012-10-03 07:35:19 【问题描述】:

我有下表:

Desk_name | head
ali       | john 
cars ln   | max
pol fr    | max
jus       | john

我想创建一个存储过程以获得回报:

Name      | sector_head
ali mm    | john
cars ln   | max
pol fr    | max
jus mm    | john

如您所见,列名称已更改(从“名称”更改为“桌面名称”),并且“名称”列中的每个名称如果是单个单词,则在每个值的末尾都有缩写“mm”( ali 和 jus)。

这样的存储过程怎么做(我用的是sql server)?

谢谢

【问题讨论】:

'ali' 是一个单词,不像'cars ln'。如果我有一个单词,我想在它前面添加'mm',所以'ali'变成'ali mm' 【参考方案1】:

你需要提供ALIAS就可以了,例子

SELECT CASE WHEN LTRIM(RTRIM(Desk_name)) LIKE '% %'  -- finds any space in string
            THEN Desk_name 
            ELSE Desk_name + ' mm'
       END AS Name, 
       head AS sector_head 
FROM   tableName

SQLFiddle Demo

【讨论】:

@JoeGJoseph 是的,我也经历过,当您仍在输入答案并且有人提交的答案与他的答案相同时,他通常会指责您复制了粗鲁的答案. :D【参考方案2】:

试试这个:

在sql server中

select case when charindex(' ',ltrim(rtrim(Desk_name)))=0 
            then Desk_name+' mm' 
            else Desk_name 
       end  as Name ,
       head as sector_head
from your_table 

SQL fiddle demo

【讨论】:

现在可以了,如果需要,请添加this fiddle code作为示例 不错! +1 使用 charindex @Yaroslav:非常感谢......我已经在我的回答中添加了它【参考方案3】:
SELECT CASE WHEN Desk_name = 'ali' OR Desk_name = 'jus'  THEN Desk_name + ' mm' ELSE Desk_name END AS Name, 
head AS sector_head
FROM DeskName 

【讨论】:

这不是动态的,如果它的值为hello world呢?【参考方案4】:

据我了解,您需要在更新表之前重命名列 Desk_name。要做到这一点,你可以试试这个:

sp_RENAME 'YourTableName.Desk_name' , 'Name', 'COLUMN'

它应该重命名您的列。之后,您应该使用 Joe 或 John 的解决方案来更新表中的记录。

【讨论】:

以上是关于如何通过存储过程更改列名并更改表中的值?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中插入和从存储过程中选择

如何锁定正在执行的存储过程并更改存储过程返回的表?

访问数据库表中的值,并把它们作为一个参数,在MySQL存储过程

在 sybase 中,如何锁定正在执行的存储过程并更改存储过程返回的表?

如何更改 Snowflake 存储过程中的会话参数

列名或提供的值的数量与存储过程中的表定义不匹配