如何拆分和替换存储过程?

时间:2016-10-25 05:01:13

标签: sql sql-server stored-procedures

我想将e_Mail中的所有@tablename列替换为我的用户表(我的主表)。

例如:

@tablename

[name]           [eMail]         // columns 
------------------------------------------------------    
name surname     blahblah@gmail.com

我的users

[name]           [eMail]
----------------------------------------
name surname     blahblah@hotmail.com

我想将此行的电子邮件列更新为' blahblah@hotmail.com'在@tablename。

程序会做什么?

1-从@tablename

获取eMail列的第一个值

2-拆分值(拆分字符:@)并获取第一个值(例如,如果值为blahblah@gmail.com,则获取gmail.com)

3-在用户表中搜索第一个值

4-当用户表中的查找值时,(代码必须找到blahblah@hotmail.com)在@tablename中将电子邮件更新为blahblah@hotmail.com

5-从@tablename

获取电子邮件列的第二个值

所以,我写了一个存储过程。但是这个程序不起作用。问题在哪里?

Create Proc update_eMail
    (@tablename nvarchar(50),
     @columnname nvarchar(50))
AS
Begin 
    Declare @get_oldeMail nvarchar(100)
    Declare @get_eMail nvarchar(100)
    Declare @get_SplitValue nvarchar(100)
    Declare @get_oldSplitValue nvarchar(100)
    Declare @rowNumber int
    Declare @users_rowNumber int
    Declare @i int
    Declare @j int

    Declare @q_getRowNumber NVARCHAR(MAX)
    Declare @q_getoldeMail NVARCHAR(MAX)
    Declare @q_UpdateQuery NVARCHAR(MAX)

    SET @q_getRowNumber = N'SELECT  Count(ID) 
              FROM ' + QUOTENAME(@tablename)

    EXECUTE @rowNumber = sp_executesql @q_getRowNumber

    /*Set @rowNumber = (Select Count(ID) from @tablename)*/

    Set @users_rowNumber = (Select Count(ID) from tblusers)
    Set @i = 1
    Set @j = 1

    While(@i <= @rowNumber) 
    BEGIN
        Set @q_getoldeMail = '(SELECT Lower(@columnname) FROM (
      SELECT
        ROW_NUMBER() OVER (ORDER BY ID) AS rownumber
          ,ID
          ,[Name]
          ,[Description]
          ,[Status]
          ,[AssignedTo]
          ,[AssignedToMail]
          ,[CC]
      FROM' + @tablename + '
    ) AS ar
    WHERE rownumber = @i)'

      EXECUTE @get_oldeMail = sp_executesql @q_getoldeMail

      Set @get_oldeMail = REPLACE(@get_oldeMail,'ı','i')

      WHILE LEN(@get_oldeMail) > 0 
      BEGIN
          IF CHARINDEX('@',@get_oldeMail) > 0
              SET  @get_oldSplitValue = SUBSTRING(@get_oldeMail,0,CHARINDEX('@',@get_oldeMail))
          ELSE
          BEGIN
              SET  @get_oldSplitValue = @get_oldeMail
              SET @get_oldeMail = ''
          END

          SET @get_oldeMail = REPLACE(@get_oldeMail,@get_oldSplitValue + '@' , '') 
     END

     While(@j <= @users_rowNumber) 
     BEGIN
        Set @get_eMail = (SELECT Replace(Lower(eMail),'ı','i') FROM (
          SELECT 
          ROW_NUMBER() OVER (ORDER BY ID) AS rownumber
          ,eMail
          FROM tblusers) AS ar
          WHERE rownumber = @j)

            WHILE LEN(@get_eMail) > 0
                BEGIN
                    IF CHARINDEX('@',@get_eMail) > 0
                        SET  @get_SplitValue = SUBSTRING(@get_eMail,0,CHARINDEX('@',@get_eMail))
                    ELSE
                        BEGIN
                        SET  @get_SplitValue = @get_eMail
                        SET @get_eMail = ''
                        END
                 SET @get_eMail = REPLACE(@get_eMail,@get_SplitValue + '@' , '') 
                 END
                 if(@get_splitValue = @get_oldSplitValue)
            begin
                Set @q_UpdateQuery = 'Update ar Set ' + @columnname + ' = ' + @get_email + ' Where rownumber = ' +@i
                EXECUTE  sp_executesql @q_UpdateQuery
                break
            end


        SET @j = @j+1
        END

SET @i = @i+1

END

End

提前致谢。

0 个答案:

没有答案