Sql 不同的结果集,尽管(表面上)有相同的查询

Sql 不同的结果集,尽管(表面上)有相同的查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在运行以下查询唯一的区别是,我在第一种情况下应用了修复字符串,在第二种情况下应用了预声明的变量名 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

我正在运行以下查询唯一的区别是,我在第一种情况下应用了修复字符串,在第二种情况下应用了预声明的变量名

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 + '%'
当然,我确实意识到字符串的串联不是等价的,计算机的匹配也不同。然而,我确实得到了三种不同的集合大小,这取决于我是否没有where 256点击,是否使用concatenated where 163点击,或者是否使用固定where 45点击

我到底对什么一无所知?如何在过滤之前强制表达式完全求值添加括号没有任何区别。

在SQL Server中使用varchar时始终使用长度:

declare @name varchar(255) = 'directdebit';
此上下文中的默认长度为1,因此@name被设置为“d”。

在SQL Server中使用varchar时始终使用长度:

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

此上下文中的默认长度为1,因此@name被设置为“d”。

因为您的varchar是1个字符长度:

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

%d%
因此,使用类似“%d%”的方法比使用类似“%directdebit%”的方法找到更多的结果是非常简单的

声明具有固定或最大长度的VARCHAR:

然而,不要误解。如果您将一些其他值转换为VARCHAR,那么它将很好地工作。例如:


选择CAST1024作为VARCHAR;将返回1024作为varchar,而不是INT。

因为您的varchar长度为1个字符:

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

%d%
因此,使用类似“%d%”的方法比使用类似“%directdebit%”的方法找到更多的结果是非常简单的

声明具有固定或最大长度的VARCHAR:

然而,不要误解。如果您将一些其他值转换为VARCHAR,那么它将很好地工作。例如:


选择CAST1024作为VARCHAR;将返回1024作为varchar,而不是INT。

对于字符串来说,这必须是最符合条件的默认长度之一。默认情况下,字符串的定义应该与char不同!至少在我的脑海里,坐在一个C开发人员的身体上+1为清晰起见。这必须是字符串中最具哥特式的默认长度之一。默认情况下,字符串的定义应该与char不同!至少在我的脑海里,坐在一个C开发人员的身体上+1为清楚起见。