2017-08-03 49 views
3

我正在使用T-SQL進行查詢。如何在T-SQL中將LIKE和CONCAT()與變量一起使用

目標:返回包含存儲在變量中名稱的行。

我的問題:查詢返回所有行,不進行篩選。

附加信息:名稱存儲爲varchar和有這就是爲什麼我想連接以「%」的變量的字母后的幾個空格。

此外,當我在變量的末尾附加一個'%'後運行查詢時,數據庫將返回以'D'開頭的所有記錄。

我查詢

DECLARE @fName as varchar; 
SET @fName='DILLON'; 

SELECT DISTINCT 
    e.FIRST_NAME, e.LAST_NAME, e.EMAIL_ADDRESS 
FROM 
    [172.20.11.11].LSLMDB.dbo.vwEmployee e 
JOIN 
    [172.20.11.11].LSLMDB.ls_apps.PAEMPLOYEE pa ON pa.EMPLOYEE = e.EMPLOYEE 
JOIN 
    [172.20.11.11].LSLMDB.ls_apps.PCODES pc ON pa.LOCAT_CODE = pc.CODE 
JOIN 
    [172.20.11.11].LSLMDB.ls_apps.PCODESDTL pcd ON pc.CODE = pcd.CODE 
WHERE 
    e.FIRST_NAME LIKE CONCAT('%',@fName,'%'); 

我明白任何試圖幫助!

+3

永遠,永遠* *有一個明確的長度聲明你'varchar'變量。免得你意外地只出現一個字符,就像你現在跑進去一樣。這是[踢壞習慣](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx)。 –

+0

感謝您的諮詢! – DillonHarless

+0

儘管解決方案相當簡單,但這個問題的提問非常好......感謝您付出努力並歡迎SO Dillion。 – Hogan

回答

3

問題是系統默認爲DECLARE @fName as varchar(1) - 這可能不是你想要的。更改爲DECLARE @fName as varchar(100);這應該按預期工作。

查詢返回所有行,不進行篩選。

不,它返回所有包含D的行。根據coallation設置,這可能包括大寫和小寫匹配

而且,當我跑只用一個「%」附加在變量的末尾查詢,數據庫返回的所有記錄以「d」開頭。

因爲它只是一個單個字符過濾器成爲D%這將返回所有記錄開始D.

+0

甜,謝謝!忽略了......我的代表不會讓公衆投票改變,只是你知道。 – DillonHarless

+0

@DillonHarless--我認爲你只需等待幾分鐘,然後才能在你的關卡進行投票。祝你好運。 – Hogan

相關問題