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为清楚起见。