【问题标题】:how to replace string values of column values by SQL Stored Procedure如何通过 SQL 存储过程替换列值的字符串值
【发布时间】:2015-02-03 10:56:42
【问题描述】:

我正在使用 SQL Server 2012,我需要从列值中删除特定的字符串数据,该字符串已为用户多次保存到列中。

我需要为它编写存储过程。我的表结构如下。

Id      UserId     ColumnNeedUpdate         Address
1       2565       l:\xyz\sfd\mybook.png    Mumbai
1       2565       l:\xyz\sfd\myook.png     Mumbai
1       2565       l:\xyz\sfd\mbook.png     Mumbai
1       2465       l:\xzd\sfd\mybook.png    Mumbai
1       2265       C:\myz\sfd\mybook.png    Mumbai
1       2965       C:\xsz\sfd\mybook.png    Mumbai
1       2565       l:\xyz\sfd\maybook.png   Mumbai
1       2765       C:\zxu\sfd\mybook.png    Mumbai
1       2465       m:\xdz\sfd\mybook.png    Mumbai

现在,如果我为用户 2565 编写选择查询,结果将如下所示。

1       2565       l:\xyz\sfd\mybook.png    Mumbai
1       2565       l:\xyz\sfd\myook.png     Mumbai
1       2565       l:\xyz\sfd\mbook.png     Mumbai
1       2565       l:\xyz\sfd\maybook.png   Mumbai

编写存储过程的目的是更新列“ColumnNeedUpdate”,如下所示。

mybook.png, myook.png,mbook.png,maybook.png

我对 sql server 存储过程很陌生,所以我尝试了以下方式。

Create PROCEDURE UsingExistsstoredprocedure(@Id int)
AS
DECLARE @ResultValue int,@ResultFirstName nvarchar(500),@imax int,@i int;
BEGIN TRAN
IF EXISTS(SELECT Name FROM Image WHERE UserId = @Id)
     BEGIN
        SET @imax=@@ROWCOUNT
        SET @i=1

    WHILE(@i<=@imax)
    BEGIN
        SET @ResultFirstName =(SELECT Name FROM [picsilo].[dbo].[Image] WHERE UserId=@i);
        IF CHARINDEX('\',@ResultFirstName)>0
        SET @ResultFirstName=SUBSTRING(@ResultFirstName,0,CHARINDEX('\',@ResultFirstName))
    INSERT Into Image (Name)VALUES(@ResultFirstName)
    END
 END

【问题讨论】:

  • 到目前为止你有没有尝试过?你遇到过什么问题?

标签: sql sql-server stored-procedures


【解决方案1】:
UPDATE MyTable SET ColumnNeedUpdate = 
    REPLACE(ColumnNeedUpdate, 'l:\xyz\sfd\', '')
WHERE UserId = 2565

免责声明:此代码会更改表中的数据。自行决定使用。

【讨论】:

  • 如果要删除的前缀不是静态“l:\xyz\sfd\”字符串怎么办?
  • 查看 Jérôme 的答案,它使用 CHARINDEX 查找字符串中最后一个反斜杠的位置。
  • @Dan 感谢您的回答。帮助我回答了我自己的问题,所以我一定要参考这个问题。谢谢!我对此投了赞成票。
【解决方案2】:

即使使用非静态 "l:\xyz\sfd\" 字符串,它也应该可以工作:

UPDATE MyTable SET ColumnNeedUpdate = 
    REVERSE(SUBSTRING(REVERSE(ColumnNeedUpdate), 0,
       CHARINDEX('\', REVERSE(ColumnNeedUpdate)) - 1))
WHERE UserId = 2565

【讨论】:

  • 去掉 -1 否则会跳过第一个字符
【解决方案3】:
CREATE PROCEDURE UsingExistsstoredprocedure(@Id int)
AS
BEGIN
    UPDATE MyTable SET ColumnNeedUpdate =
        REVERSE(SUBSTRING(REVERSE(ColumnNeedUpdate ), 0, 
          CHARINDEX('\',REVERSE(ColumnNeedUpdate )))) 
    FROM MyTable WHERE UserId = @Id 
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2020-10-10
    • 2011-10-19
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多