基本上,我正在尝试遍历@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)
,我无法看出这是问题。
什么阻止了预期的打印输出?
答案 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
的每个值。