T-SQL替换字符串的条件

时间:2016-03-17 16:44:55

标签: sql-server tsql replace

我们替换我们的动态sql字符串,比如replace(@ sqlString,'dbo',@ dbName +'dbo')。 并且@sqlString可能包含多个select语句,它可能是特定的。

original sql : select * from dbo.TableOne
replaced     : select * from HOSTED.dbo.TableOne

当包含Db名称时,我们不想替换。如何处理它。如果以前的rom dbo字符包含不替换的点字符,则可以控制。

错误情况。

original sql : select * from HOSTED.dbo.TableOne
replace      : select * from HOSTED.HOSTED.dbo.TableOne

修改

为什么我想点dot charachter,因为有时动态sql不包含这样的空格。

select * from dbo.TableOne where ColumnOne>=dbo.SpecialFunction.

2 个答案:

答案 0 :(得分:1)

您可以在'dbo'之前使用DECLARE @dbName SYSNAME = 'HOSTED'; DECLARE @sqlString VARCHAR(MAX) = 'select * from dbo.TableOne'; SELECT REPLACE(@sqlString,' dbo',' '+@dbName+'.dbo') AS result SET @sqlString = 'select * from HOSTED.dbo.TableOne'; SELECT REPLACE(@sqlString,' dbo',' '+@dbName+'.dbo') AS result 空格:

@dbName

LiveDemo

请注意,如果NULL@sqlString,则整个NULL将为REPLACE

修改

您可以使用多个>(您应该处理=(DECLARE @dbName SYSNAME = 'HOSTED'; DECLARE @sqlString VARCHAR(MAX) = 'select * from dbo.TableOne where ColumnOne>=dbo.SpecialFunction.'; SELECT REPLACE(REPLACE(@sqlString,'=dbo','='+@dbName+'.dbo') ,' dbo',' '+@dbName+'.dbo') AS result ,...):

config.hideStatusBar = true;
config.useImmersiveMode = true;

LiveDemo

答案 1 :(得分:0)

问题是如何区分dbo.someTablesomeDB.dbo.someTable并仅用第一个替换dbo。您可以通过转义此代码中的.dbo

来解决这个问题
declare @sqlString nvarchar(max) = N'select * from dbo.TableOne where HOSTED.dbo.TableOne.somefield = someValue';
declare @dbName nvarchar(max) = N'HOSTED';

-- replace '.dbo' with something else like for example incorrect variable name
set @sqlString = replace (@sqlString, N'.dbo', N'@._d_b_o');

-- add database name before 'dbo.'
set @sqlString = replace(@sqlString, N'dbo.', concat(@dbName,N'.dbo.'));

-- restore escaped '.dbo' to original value
set @sqlString = replace (@sqlString, N'@._d_b_o', N'.dbo');

select @sqlString;

上面的代码将返回

  

从HOSTED.dbo.TableOne中选择*,其中HOSTED.dbo.TableOne.somefield = someValue

即使您在dbo之前没有像此字符串中那样的空格

,此解决方案仍然有效
  

从dbo.TableOne中选择*,其中ColumnOne> = dbo.SpecialFunction

当您使用replace函数时,您必须了解区分大小写,因此如果您需要使用不区分大小写的替换,请检查示例here