我们替换我们的动态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.
答案 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.someTable
和someDB.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。