【问题标题】:Issue Using SQL Replace Function with Variable使用带变量的 SQL 替换函数的问题
【发布时间】:2017-06-11 07:35:39
【问题描述】:

本质上,我正在尝试遍历@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 reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur。 someString sint occaecat cupidatat non someString, sint in culpa qui officia deserunt mollit anim id est laborum。

After

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

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

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

【问题讨论】:

  • 您可能想使用replace(@spname, 'someString', 'Hello') 而不是replace(@spname, '%someString%', 'Hello') .. 要替换的字符串应该声明为字面意思 .. 通配符在这里不起作用。跨度>
  • @vpk,这行得通。我显然不明白通配符是如何工作的。我知道您说这是因为我在这种情况下要查找的字符串是按字面意思声明的,但是为什么通配符在这种情况下不起作用?通配符不是表明它可以在字符串的任何部分中找到吗?
  • @vpk,如果您添加您的评论作为答案,我将很乐意接受。
  • @cwanjt 您需要通配符来定义搜索模式。 %a 表示以“a”结尾,而%a% 表示*“a”在中间某处,a% 表示“以“a”开头。REPLACE 会找到并替换给定的字符串,无论它位于何处 - 甚至多次。如果您知道要更改的字符串位于开头或结尾,您可能会使用 LEFT 或 @ 987654335@ 切断这部分并将其余部分与您的新字符串连接。
  • 你真的需要一个光标吗?为什么不使用简单的选择?

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


【解决方案1】:

除了在搜索字符串中不使用通配符之外,您实际上也不需要光标。 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 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多