2014-04-03 15 views
1

T-SQL函數的屬性如PATINDEX允許它在模式參數中接受通配符?我問,因爲有某些功能,如LEN,不接受通配符。例如:某些T-SQL函數如何知道在其輸入參數中接受通配符?

SELECT LEN('[TML]IME') 
SELECT DATALENGTH('[TML]IME') 

即使遵循這樣的通配符序列的任何字符串總是4個字符長,兩者都返回8。我的直覺認爲,函數內部的某些切換迫使字符串被視爲文字,但我試圖找到這樣的文檔失敗了。這裏發生了什麼?

+2

我想你可能來自* nix世界,shell將在程序調用之前實際擴展字符串。這不是在這裏發生的。你看到的是你得到的:8個字符。 – Hogan

回答

3

如果你只是用'[TML]IME'語法來說話,那麼這只是函數的功能。這不是輸入參數的問題。 PATINDEX處理非常基本的RegEx樣方括號,因爲這是PATINDEX函數的代碼。

LENDATELENGTH功能沒有做任何事情超過測量你傳進去的字符串的長度。

它不應該被認爲傳遞一個字符串轉換成一個功能意味着它會在同一個解析與PATINDEX和LIKE運算符一樣。

現在,有一些功能內搭*通配符來表示「所有領域」,如CHECKSUMBINARY_CHECKSUM,並且具有與T-SQL和內部功能,我相信寫的API做在C++中,並且可以處理重載(相同的函數名稱,但不同的輸入參數),這是T-SQL或SQLCLR函數中不允許的。

+0

「不應該假定將字符串傳遞給函數意味着它將像PATINDEX和LIKE運算符一樣被解析。」因此,如果沒有人可以查閱哪些功能確實接受了模式,那麼除了簡單測試之外,他們是否還有其他方法來確認行爲?問另一種方式:是否記錄了這些功能的實現,或者這些功能對於那些在Microsoft之外進行查看的用戶是黑匣子? – FolksymAndrew

+1

@FolksymAndrew:我認爲應該假定函數不會像PATINDEX和LIKE那樣以準RegEx方式處理字符串輸入參數。主要是因爲我認爲這是唯一有這種行爲的兩件事。你可以在這裏找到記錄的所有T-SQL函數:http://msdn.microsoft.com/en-us/library/bb510741.aspx那是你在找什麼? –

+0

我更多地提到了你所說的C++函數。對我來說MS似乎不太可能會發布他們用來實現LEN(或其任何函數)的代碼,但我會好奇地想知道更多關於這些函數的內部信息。 – FolksymAndrew

相關問題