2015-07-20 62 views
0

我運行以下查詢(唯一的區別是我在第一種情況下施加一個固定柱和預聲明變量在第二個。不同的結果集,儘管(貌似)等效的查詢

declare @name as varchar = 'directdebit' 

select S.name as [Schema], T.name as [Table], 'Table' as Type 
from sys.tables as T 
inner join sys.schemas as S on S.schema_id = T.schema_id 
where T.name like '%directdebit%' 

select S.name as [Schema], T.name as [Table], 'Table' as Type 
from sys.tables as T 
inner join sys.schemas as S on S.schema_id = T.schema_id 
where T.name like '%' + @name + '%' 

當然,我也知道的字符串拼接不等同與計算機不同的匹配。但是,我得到三個不同的集大小,取決於我是否去無其中(256次點擊),如果我去連接其中(163命中)或者如果我去固定其中(45次點擊)。

究竟是什麼我不知道?如何在過濾之前強制表達式得到充分評估(添加括號沒有任何區別)。

回答

2

因爲你的VARCHAR是1個字符長度:

DECLARE @name AS VARCHAR = 'directdebit'; 
SELECT '%' + @name + '%'; 

結果:

%d% 

所以這是相當簡單的,更多的結果是使用LIKE '%d%'LIKE '%directdebit%'

固定聲明你的VARCHAR發現或MAX長度:

DECLARE @name VARCHAR(MAX) = 'directdebit'; 

但是,不要誤會。如果你正在轉換一些其他值AS VARCHAR,它會正常工作。例如:

SELECT CAST(1024 AS VARCHAR);將返回1024作爲varchar,而不是INT。

2

始終使用長度在SQL Server中使用時varchar()

declare @name varchar(255) = 'directdebit'; 

在該上下文中的缺省長度爲1,因此@name被設置爲'd'

+0

這必須是字符串最常見的默認長度之一。一個*字符串*由它的定義應該**默認**不同於* char *!至少在我的頭上坐着一個C#開發人員的身體......爲了清晰起見。 –