簡體   English   中英

TSQL-URL中的控制器和操作

[英]TSQL - Controller and Action from URL

我的應用記錄了url請求,例如:“ / Users / Edit”,“ / News /”和“ /”。
幾乎所有的url也都可以通過web-api獲得,它在所有內容之前都有一個“ / api”。

我需要一個查詢

  1. 給定“ / Users / Edit /”,我得到“ Users”和“ Edit”(可選/只要結果恆定)
  2. 給定“ / Users /”,我得到“ Users”,並且為NULL
  3. 給定“ /”,我得到NULLNULL
  4. 給定“ /Content/myCss.css”,我得到“內容”和( NULL或“ myCss.css”)
  5. 忽略“ / api”

基本上,我想要的是獲取控制器和該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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM