2012-11-05 48 views
5

我想将一个类似参数设置为一个变量并允许该变量接受通配符(mssql 2005)。如果我使用我的参数集'%'它只返回一个子集,但如果我硬编码查询使用'%'它将返回完整的集合。为什么变量的行为可能与字符串不同?声明变量的行为与硬编码字符串不同

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

VS

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

完整场景基于标志切换但高于

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; 

由于

+1

@wareno等于'%000' –

+3

但是你想要做什么?你没有指定使用'LIKE'谓词比较哪些字符串,就像'%''为什么? –

+0

我实际上是在预先设定的值和基于另一个标志的通配符之间切换@wareno。在某些情况下,我需要覆盖输入的值并选择所有wareno – Joe

回答

9

char(4)变量将被填充出代码下可再现的有三个尾随空间。

这些是significant in a LIKE pattern它只会匹配以三个空格结尾的值。改为使用varchar(4)

+0

宾果。感谢:D – Joe

+0

Martin:我认为Sql Server使用不同的'执行',如果该值存在于编译时或者它是未知的。如果该值已知,则sql服务器根据静态生成最佳计划值,否则它估计''行数'。我是吗? – praveen

+0

@praveen - 这是(种)真实的,但不影响OP的问题。如果该值是一个参数,则会根据传递的第一个值进行嗅探和编译。如果它是一个变量,SQL Server将只使用一般估计值。对于“OPTION(RECOMPILE)”,可以用它来考虑实际的运行时间值。 –

相关问题