[英]TSQL - Controller and Action from URL
我的應用記錄了url請求,例如:“ / Users / Edit”,“ / News /”和“ /”。
幾乎所有的url也都可以通過web-api獲得,它在所有內容之前都有一個“ / api”。
我需要一個查詢
/
只要結果恆定) NULL
NULL
和NULL
NULL
或“ myCss.css”) 基本上,我想要的是獲取控制器和該URL文本的操作...
您幾乎完成了。 嘗試一點xml。
-- Sample data.
declare @URLs as Table ( URL VarChar(256), Controller VarChar(256), [Action] VarChar(256) );
insert into @URLs ( URL ) values
( '/Users/Edit/' ),
( '/Users/' ),
( '/' ),
( '/Content/myCss.css' ),
( '/api/Users/Edit/' ),
( '/api/Users/' ),
( '/api/' ),
( '/api/Content/myCss.css' );
select * from @URLs;
-- Flog it into submission.
select URL, XMLURL, Ele2, Ele3, Ele4, Leonard.Controller, Leonard.[Action]
from @URLs as U cross apply
( select Cast( '<root><ele>' + Replace( URL, '/', '</ele><ele>' ) + '</ele></root>' as XML ) as XMLURL ) as XU cross apply
( select XMLURL.value('(/root/ele)[2]', 'varchar(256)') as Ele2,
XMLURL.value('(/root/ele)[3]', 'varchar(256)') as Ele3,
XMLURL.value('(/root/ele)[4]', 'varchar(256)') as Ele4 ) as XE cross apply
( select NullIf( case when Ele2 = 'api' then Ele3 else Ele2 end, '' ) as Controller,
NullIf( case when Ele2 = 'api' then Ele4 else Ele3 end, '' ) as [Action] ) as Leonard;
-- Update the table.
update U
set Controller = Leonard.Controller, [Action] = Leonard.[Action]
from @URLs as U cross apply
( select Cast( '<root><ele>' + Replace( URL, '/', '</ele><ele>' ) + '</ele></root>' as XML ) as XMLURL ) as XU cross apply
( select XMLURL.value('(/root/ele)[2]', 'varchar(256)') as Ele2,
XMLURL.value('(/root/ele)[3]', 'varchar(256)') as Ele3,
XMLURL.value('(/root/ele)[4]', 'varchar(256)') as Ele4 ) as XE cross apply
( select NullIf( case when Ele2 = 'api' then Ele3 else Ele2 end, '' ) as Controller,
NullIf( case when Ele2 = 'api' then Ele4 else Ele3 end, '' ) as [Action] ) as Leonard;
select * from @URLs;
想法是將每個URL轉換為XML,並且路徑上的每個元素都是單獨的XML元素。 由於可以使用XML.value
通過索引訪問元素,因此很容易挑選出前幾個元素,使用case
忽略'api'
,並使用NullIf
將任何空字符串轉換為null。
對於只了解T-SQL辯證法(要求每行以非數字,非字母字符開頭)的用戶,提供了以下原始示例的大寫翻譯:
;DECLARE @URLS TABLE
(URL VARCHAR
(256
)
,CONTROLLER VARCHAR
(256
)
,[ACTION] VARCHAR
(256
)
)
;INSERT @URLS
( URL
) VALUES
('/Users/Edit/'
)
,
('/Users/'
)
,
('/'
)
,
('/Content/myCss.css'
)
,
('/api/Users/Edit/'
)
,
(
'/api/Users/'
)
,
('/api/'
)
,
('/api/Content/myCss.css'
)
;SELECT
* FROM @URLS
;SELECT URL
,XMLURL
,ELE2
,ELE3
,ELE4
,LEONARD
.CONTROLLER
,LEONARD
.
[ACTION]FROM @URLS U CROSS APPLY
(SELECT CAST
('<ROOT><ELE>'
+REPLACE
(URL
,'/'
,'</ELE><ELE>'
)
+'</ELE></ROOT>'AS XML
)XMLURL
)XU CROSS APPLY
(SELECT XMLURL
.value
('(/ROOT/ELE)[2]'
,'VARCHAR(256)'
)ELE2
,XMLURL
.value
('(/ROOT/ELE)[3]'
,'VARCHAR(256)'
)ELE3
,XMLURL
.value
('(/ROOT/ELE)[4]'
,'VARCHAR(256)')ELE4
)XE CROSS APPLY
(SELECT NULLIF
(CASE WHEN ELE2
='API' THEN ELE3 ELSE ELE2 END
,''
)CONTROLLER
,NULLIF
(CASE WHEN ELE2
='API' THEN ELE4 ELSE ELE3 END
,''
)[ACTION]
)LEONARD
;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.