使用SQL替换函数和变量的问题

时间:2017-01-25 22:51:41

标签: sql sql-server-2008 tsql replace ssms

基本上,我正在尝试遍历@sprocs变量的内容,实现替换功能,并打印相应的更改。当我执行代码时,@spname变量被打印掉,而不是预期的结果。

declare @sprocs cursor
declare @spname nvarchar(max)

set @sprocs = cursor for
select ROUTINE_DEFINITION
from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_TYPE = 'Procedure' AND
ROUTINE_DEFINITION like '%someString%'


open @sprocs
fetch next from @sprocs into @spname
while @@FETCH_STATUS = 0
Begin
    set @spname = replace(@spname, '%someString%', 'Hello')
    print @spname
    fetch next from @sprocs into @spname
end

预期结果如下:

Before

Lorem ipsum dolor sit amet,someString adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam,quis nostrud exercitation ullamco someString nisi ut aliquip ex ea commodo consequat。 Duis aute irure dolor in repreptderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 someString sint occaecat cupidatat non someString,sunt in culpa qui officia deserunt mollit anim id est laborum。

After

Lorem ipsum dolor sit amet,你好adipiscing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua。 Ut enim ad minim veniam,quis nostrud exercitation ullamco Hello nisi ut aliquip ex ea commodo consequat。 Duis aute irure dolor in repreptderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。你好sint occaecat cupidatat非你好,在culpa qui officia deserunt mollit anim id est laborum中被捕。

我认为 - 最初 - 这可能是@spname变量类型的问题,但由于它被声明为nvarchar(max),我无法看出这是问题。

什么阻止了预期的打印输出?

1 个答案:

答案 0 :(得分:1)

除了在searchstring中不使用通配符外,您还真的不需要游标。 SQL基于数据集工作,并将您在标准select语句中执行的任何操作应用于返回的所有行。

鉴于此,您的陈述应该是:

select ROUTINE_DEFINITION
      ,replace(ROUTINE_DEFINITION,'someString','Hello') as ReplacedValues
from INFORMATION_SCHEMA.ROUTINES
where ROUTINE_TYPE = 'Procedure'
  and ROUTINE_DEFINITION like '%someString%'

replace函数应用于查询返回的ROUTINE_DEFINITION的每个值。