尽管(看似)等效查询

时间:2015-07-20 17:21:07

标签: sql sql-server tsql

我正在运行以下查询(唯一的区别是我在第一种情况下应用修复字符串,在第二种情况下应用预先声明的变量 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次点击)。

我究竟知道什么?如何在过滤之前强制对表达式进行全面评估(添加括号并没有给出任何差异)。

2 个答案:

答案 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。