Sql 声明的变量与硬编码字符串的行为不同

Sql 声明的变量与硬编码字符串的行为不同,sql,sql-server,variables,Sql,Sql Server,Variables,我试图在变量中设置一个like参数,并允许该变量接受通配符(mssql 2005)。如果使用参数集“%”,它只返回部分子集,但如果将查询硬编码为使用“%”,它将返回完整集。为什么变量的行为可能与字符串不同 DECLARE @wareno char(4); SET @wareno = '%'; select @wareno as a, * from waredesc where wareno like @wareno; vs 整个场景是基于标志切换的,但在上述代码下是可复制的 DECLARE

我试图在变量中设置一个like参数,并允许该变量接受通配符(mssql 2005)。如果使用参数集“%”,它只返回部分子集,但如果将查询硬编码为使用“%”,它将返回完整集。为什么变量的行为可能与字符串不同

DECLARE @wareno char(4); 
SET @wareno = '%';
select @wareno as a, * from waredesc where wareno like @wareno;
vs

整个场景是基于标志切换的,但在上述代码下是可复制的

DECLARE @wareno char(4); 
DECLARE @delprods bit;

/**
SET THESE PARAMETERS
**/
SET @wareno = '1'; 
SET @delprods = 'true'; /** if true all the warehouses should also be emptied for safety - products are held at a company level!**/

IF @delprods = 1
BEGIN
    SET @wareno = '%';
END
select @wareno as a, * from waredesc where wareno like @wareno;
谢谢变量
char(4)
将用三个尾随空格填充


这些是,它将只匹配以三个空格结尾的值。改用
varchar(4)

但你想做什么?您没有使用
LIKE
谓词指定要比较的字符串,只是
LIKE“%”
为什么?我实际上是在@wareno之间根据另一个标志在预先设置的值和通配符之间切换。在某些情况下,我需要覆盖输入的值并选择“全部”wareno@user1800273您是否正在尝试查找所有包含字符串文字字符
%
wareno
?Martin:我认为Sql Server使用不同的
执行
,如果值在
编译时存在,或者是在
未知
。如果该值已知,则sql server会根据静态值生成最佳计划,否则它会估计
行数
。我说得对吗?@praveen-这(有点)正确,但不会影响OP的问题。如果该值是一个参数,则将根据传递的第一个值对其进行嗅探和编译。如果它是一个变量,SQL Server将只使用一般估计。对于任何一个
选项(重新编译)
都可以用来让它考虑实际的运行时值。@MartinSmith:谢谢您的澄清
DECLARE @wareno char(4); 
DECLARE @delprods bit;

/**
SET THESE PARAMETERS
**/
SET @wareno = '1'; 
SET @delprods = 'true'; /** if true all the warehouses should also be emptied for safety - products are held at a company level!**/

IF @delprods = 1
BEGIN
    SET @wareno = '%';
END
select @wareno as a, * from waredesc where wareno like @wareno;