我不是SQL专家所以请原谅我,如果这是SQL 101 :)。
在select语句中有2个替换函数。他们寻找一个Servername,它的管理员分享d $由它的UNC路径。示例'\ SERVERNAME \ d $' 然后用'D:'替换'\ SERVERNAME \ d $'。
以下是目前的查询:
select Replace(p.Path,'\\SERVERNAME\d$','D:') as searchpath
,p.path as fullpath
,s.ShareName
,s.SharePath
,p.Member
,p.Access
From Paths As p
Left Outer Join Shares as s on
Replace(p.Path,'\\SERVERNAME\d$','D:') Like s.SharePath + '\%'
到目前为止,它一直是d $。 今天我的需求已经改变,我需要查询找到任何服务器名称UNC路径管理员共享,无论共享字母(c $,d $,e $,f $ ...等),并将其替换为相应的驱动器号(D: ,E:,F:......等)。
我的想法是替换功能可以找到$并在其左侧看一个字符以获得正确的共享字母,然后将其用于替换。我不是SQL专业人员的问题是,我知道SQL可以做我需要它做的事情......我只是不知道如何到达那里。我用Google搜索并找到了一些例子,但是没有任何运气让他们工作。 任何帮助将不胜感激。
答案 0 :(得分:1)
您可以结合使用STUFF
,PATINDEX
,LEN
来获得所需内容。
示例查询
DECLARE @ReplaceChar VARCHAR(100) = '[prefixcharacters]\\SERVERNAME\d$[postcharacter]'
DECLARE @SearchString VARCHAR(100) = '\\SERVERNAME\_$'
SELECT
STUFF(@ReplaceChar,PATINDEX('%' + @SearchString + '%',@ReplaceChar),LEN(@SearchString),
UPPER(SUBSTRING(@ReplaceChar,PATINDEX('%' + @SearchString + '%',@ReplaceChar) + LEN(@SearchString) - 2,1)) + ':') as searchpath
WHERE PATINDEX('%' + @SearchString + '%',@ReplaceChar) > 0
<强>输出强>
[prefixcharacters]D:[postcharacter]
替代查询
如果您希望根据标题获取$
之前的前一个字符,则可以缩短查询。像这样的东西
DECLARE @ReplaceChar VARCHAR(100) = '[prefixcharacters]\\SERVERNAME\d$[postcharacter]'
DECLARE @SearchString VARCHAR(100) = '\\SERVERNAME\_$'
SELECT
STUFF(@ReplaceChar,
PATINDEX('%'+@SearchString+'%',@ReplaceChar),
LEN(@SearchString),
UPPER(SUBSTRING(@ReplaceChar,CHARINDEX('$',@ReplaceChar) -1,1)) + ':')
WHERE PATINDEX('%'+@SearchString+'%',@ReplaceChar) > 0
在此查询中
STUFF
将您的模式替换为$
+ ':'
之前的字符PATINDEX('%'+@SearchString+'%',@ReplaceChar)
D
通过获取{$ 1}的charindex
然后使用SUBSTRING
答案 1 :(得分:0)
DECLARE @str nvarchar (100)
SET @str = '\\SERVERNAME\d$'
IF @str LIKE '\\SERVERNAME\_$'
SET @str = UPPER(SUBSTRING(@str, 14, 1)) + ':'
SELECT @str
从上一个开始,比如
select UPPER(SUBSTRING(p.path, 14, 1)) + ':' as searchpath
,p.path as fullpath
,s.ShareName
,s.SharePath
,p.Member
,p.Access
From Paths As p
Left Outer Join Shares as s on
SUBSTRING(p.path, 14, 1) + ':' Like s.SharePath + '\%'
答案 2 :(得分:0)
¸
怎么样?select Replace(SUBSTRING(p.path, 14, Len(@spath)-14),'$',':') as searchpath
,p.path as fullpath
,s.ShareName
,s.SharePath
,p.Member
,p.Access
From Paths As p
Left Outer Join Shares as s on
Replace(SUBSTRING(p.path, 14, Len(@spath)-14),'$',':') Like s.SharePath + '\%
选择搜索路径
答案 3 :(得分:0)
我也不是mysql专家:)
根据你在问题的最后部分提到的逻辑,我使用了concat和substring来获取列中的驱动器号。
希望这有帮助
select replace(path, concat(substring(path, 1, locate('$', path) - 2), substring(path, locate('$', path) - 1, 1) , '$'), concat(substring(path, locate('$', path) - 1, 1) , ':')) as searchpath ...
查询的其余部分将是相同的。