SQL Server函数或过程,用于按其他表中的参数从表中剪切记录
我有两张桌子我要比较一下这两张桌子,第一个表有一列该列是完整的SQL Server函数或过程,用于按其他表中的参数从表中剪切记录,sql,sql-server,function,stored-procedures,Sql,Sql Server,Function,Stored Procedures,我有两张桌子我要比较一下这两张桌子,第一个表有一列该列是完整的URL,另一个表有两列第一列是urlcography,另一列是在另一个表列URL 第一张桌子是 URL http://10.6.2.26/ERP/HRServices/WorkflowService.asmx http://195.170.180.170/SADAD/PaymentNotificationService.asmx http://10.6.2.26/ERP/HRServ
URL
,另一个表有两列第一列是urlcography
,另一列是在另一个表列URL
第一张桌子是
URL
http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
http://195.170.180.170/SADAD/PaymentNotificationService.asmx
http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
http://217.146.8.6/din.aspx?s=11575802&client=DynGate&p=10002926
http://195.170.180.170/SADAD/PaymentNotificationService.asmx
http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
http://195.170.180.170/SADAD/PaymentNotificationService.asmx
http://www.google.com/
第二个表应该与
URL CUT_BEFORE
http://10.6.2.26 3
http://217.146.8.6 1
http://195.170.180.170 2
我应该将第二个表和第一列进行比较
URL
http://10.6.2.26/ERP/HRServices
http://195.170.180.170/SADAD
http://10.6.2.26/ERP/HRServices
http://10.6.2.26/ERP/HRServices
http://10.6.2.26/ERP/HRServices
http://217.146.8.6
http://195.170.180.170/SADAD
http://10.6.2.26/ERP/HRServices
http://195.170.180.170/SADAD
http://www.google.com/
在SQLServer中执行类似操作的函数脚本是什么
或者我们可以使用while循环在存储过程中实现它,因为当我尝试执行下面的最后一个函数时,我使用了这个查询
declare @table table
( main_url NVARCHAR(MAX),URL NVARCHAR(MAX), count int)
insert @TABLE
select
Main_URL,T2.Url,T2.[Count]
from
(select
URL as Main_URL,LEFT(URL1, CHARINDEX('/', URL1) - 1) as URL1
from
(select URL,replace(stuff(URL1, 1,patindex('%://%', URL1 + '0'), ''),'//','') as URL1
from (select URL, convert(nvarchar(max),[Url]) Url1 from [dbo].[InternetUsage_nn] )T1)T)T1
left outer join [dbo].[InternetUsage_URL_List] T2
on T1.URL1=convert(nvarchar(max),T2.URL) where T2.URL is not null
select dbo.FindAbsolutePath('/',Main_url,count) from @Table
等待你的答案
谢谢,我修改了我的代码。此代码块将解决您的问题
CREATE Function FindAbsolutePath(
@TargetStr varchar(8000),
@SearchedStr varchar(8000),
@Occurrence int
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @Result varchar(8000);
if CHARINDEX('http://',@SearchedStr)>0 --fix http://
BEGIN
set @Occurrence=@Occurrence+2;
END
;WITH Occurrences AS (
SELECT
Number,
ROW_NUMBER() OVER(ORDER BY Number) AS Occurrence
FROM master.dbo.spt_values
WHERE
Number BETWEEN 1
AND LEN(@SearchedStr)
AND type='P'
AND SUBSTRING(@SearchedStr,Number,LEN(@TargetStr))=@TargetStr
)
SELECT @Result= SUBSTRING(@SearchedStr,0,Number)
FROM Occurrences
WHERE Occurrence=@Occurrence
return @Result
END
--select dbo.FindAbsolutePath('/','http://10.6.2.26/ERP/HRServices/WorkflowService.asmx',3)
借助于Split
功能,以下功能满足您的要求:
CREATE FUNCTION dbo.Split(@StringToSplit NVARCHAR(MAX), @Delimiter NCHAR(1))
RETURNS TABLE
AS
RETURN
(
SELECT ID = ROW_NUMBER() OVER(ORDER BY n.Number),
Position = Number,
Value = SUBSTRING(@StringToSplit, Number, CHARINDEX(@Delimiter, @StringToSplit + @Delimiter, Number) - Number)
FROM ( SELECT TOP (LEN(@StringToSplit) + 1) Number = ROW_NUMBER() OVER(ORDER BY a.object_id)
FROM sys.all_objects a
) n
WHERE SUBSTRING(@Delimiter + @StringToSplit + @Delimiter, n.Number, 1) = @Delimiter
);
使用此函数后,代码将变得相对简洁:
DECLARE @T TABLE (URL VARCHAR(1000));
DECLARE @T2 TABLE (URL VARCHAR(1000), Cut_Before INT);
-- POPULATE TABLES HERE (NOT INCLUDED TO SAVE SPACE)
WITH CTE AS
( SELECT FullURL = t.URL,
BaseURLLength = LEN(ISNULL(t2.URL, t.URL)),
Remainder = ISNULL(REPLACE(t.URL, t2.URL, ''), ''),
Cut_Before = ISNULL(t2.Cut_Before, 1)
FROM @T AS t
LEFT JOIN @T2 AS t2
ON t.URL LIKE t2.URL + '/%'
)
SELECT t.FullURL,
Cut = SUBSTRING(t.FullURL, 1, BaseURLLength + LEN(s.Value) + s.Position - 1)
FROM CTE t
OUTER APPLY dbo.Split(t.Remainder, '/') AS s
WHERE s.ID = t.Cut_Before;
前提是,CTE中的第一个部分通过使用LIKE
连接来标识每个完整URL的部分URL。使用http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
作为一个示例,它将显示以下内容:
FullURL: http://10.6.2.26/ERP/HRServices/WorkflowService.asmx
BaseURLLength: 16
Remainder: /ERP/HRServices/WorkflowService.asmx
Cut_Before: 3
其中余数是删除部分url后完整url的剩余部分。然后,split函数将剩余部分拆分为其每个组成部分的新行:
SELECT *
FROM dbo.Split('/ERP/HRServices/WorkflowService.asmx', '/');
将返回:
ID Position Value
1 1
2 2 ERP
3 6 HRServices
4 17 WorkflowService.asmx
然后,这仅限于与Cut\u Before
值匹配的行。然后,可以使用此行来建立“剪切”完整URL的位置(起始位置+该位置值的长度)。此外,此函数还可以使用字符串中特定字符的第n个索引。谢谢兄弟。但是,当我尝试使用完整表时,它给了我一个错误,我认为我们应该在函数中添加一个循环,不是吗?或者我错了:)我想知道如何在两个表之间执行它来比较所有记录。我不理解你。比较所有记录?你的意图是什么?这个代码应该可以工作。我们可以用有趣的解决方案在存储过程中实现它吗。我建议将CTE中的JOIN
条件更改为t.URL,比如t2.URL+'/%'
,这样类似于http://1.2.3.4t2中的
与http://1.2.3.40/...
在t
@JoeFarrell中,我倾向于同意你的观点。我已对连接进行了更改。