我正在运行以下查询(唯一的区别是我在第一种情况下应用修复字符串,在第二种情况下应用预先声明的变量 name 。
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次点击)。
我究竟知道什么?如何在过滤之前强制对表达式进行全面评估(添加括号并没有给出任何差异)。
答案 0 :(得分:2)
在SQL Server中使用varchar()
时始终使用长度:
declare @name varchar(255) = 'directdebit';
此上下文中的默认长度为1,因此@name
设置为'd'
。
答案 1 :(得分:2)
因为你的varchar是1个char长度:
DECLARE @name AS VARCHAR = 'directdebit';
SELECT '%' + @name + '%';
结果:
%d%
因此使用LIKE '%d%'
而不是LIKE '%directdebit%'
使用固定或MAX
长度声明您的VARCHAR:
DECLARE @name VARCHAR(MAX) = 'directdebit';
然而,不要误解。如果您正在转换其他值AS VARCHAR,那么它将正常工作。例如:
SELECT CAST(1024 AS VARCHAR);
将返回1024
和varchar,而不是INT。