是关于LIKE关键字的匹配查询。SQL语句如下:
select 任务编号,b.单位名称,计划完成时间,特殊情况,产品类别 from 监督检查情况 a inner join 企业信息 b on a.工厂代号 =b.工厂代号 where (特殊情况=@a) and (产品类别 like ‘%@b%’) and (计划完成时间 >= @startime) and (计划完成时间 <= @endtime)
@b变量参数在上面的查询语句中,明显是有问题的。于是我告诉他应该写成:
like ‘%’+ @b +’%’
他回复我,已经试过了,没有用。
我有点不可思议地打开Management Studio, 新建一个存储过程进行测试,结果和他说的一样。变量作为LIKE关键字的%匹配似乎是有点问题。我测试的SQL如下:
CREATE TABLE [dbo].[User](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[Bool] [bit] NULL CONSTRAINT [DF_User_Bool] DEFAULT ((1))
)
CREATE PROCEDURE [dbo].[GetUser]
(@userName nchar(10))
AS
BEGIN
SELECT * FROM [User]
WHERE [Name] LIKE ‘%’+@userName+’%’
END
我Google了一下,发现确实有些朋友在问同样的问题,得到的一些答案是在传入参数前,先拼接好字符串。如:
cmd.Parameters.Add(”@user”, “%” + tbName.Text + “%”);
但是朋友的环境只能在SQL中解决,于是乎我想到在SP中SQL执行前,先处理好字符串的拼接。因此我改了SP如下:
ALTER PROCEDURE [dbo].[GetUser]
(@userName nchar(10))
AS
BEGIN
DECALRE @strName nchar(10)
SET @strName = ‘%’ + @userName + ‘%’
SELECT * FROM [User]
WHERE [Name] LIKE @strName
END
但是结果并没有如愿,查询还是没有返回我想要的结果。最后我想是不是字符串类型不匹配的问题,没有直接格式化字符串的函数,我加了一个left函数,返回等长的变量长度,结果出乎意料地好了。最后在MSDN找到了答案,问题在于这个变量的类型,我使用了nchar(或者char)。当传入参数不足10位时,nchar(char)变量将包含尾随空格。这可能是一个很小的知识点,但是却很容易忽视。因此解决办法是,修改参数类型为varchar(或nvarchar),或者对nchar(char)参数加一个RTrim函数格式化。
ALTER PROCEDURE [dbo].[GetUser]
(@userName nvarchar(10))
AS
BEGIN
SELECT * FROM [User]
WHERE [Name] LIKE ‘%’ + @userName + ‘%’
END
或者:
ALTER PROCEDURE [dbo].[GetUser]
(@userName nchar(10))
AS
BEGIN
SELECT * FROM [User]
WHERE [Name] LIKE ‘%’ + RTrim(@userName) + ‘%’
END
分享到:
相关推荐
SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解
代码如下: Use pubs declare @find varchar(30) set @find=’Ring%’ select au_lname,au_fname,phone from authors where au_lname like @find @find就是一个局部变量。 B. 在 DECLARE 中使用两个变量 下例从 ...
–把LikeSql变量赋值,可以赋值成’%xxxxxxxxxxxx%’ declare @SelectSql nvarchar(128)–定义Sql语句,开始拼Sql set @SelectSql = ‘select * from Table where [Column] like @LikePar’;—使用@LikePar变量进行...
10.1.1 在多表查询中使用子查询 187 10.1.2 在子查询中使用聚合函数 188 10.2 创建和使用返回多行的子查询 190 10.2.1 in子查询 190 10.2.2 in子查询实现集合交和集合差运算 191 10.2.3 exists子查询 192 ...
《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...
10.3.3 使用EXISTS子查询实现两表并集 10.3.4 使用NOT EXISTS的子查询 10.4 相关子查询 10.4.1 使用IN引入相关子查询 10.4.2 使用比较运算符引入相关子查询 10.4.3 在HAVING子句中使用相关子查询 10.5 UNIQUE子查询...
DB2 SQL 消息,非常方便管理员与操作者查找以便解决错误.比如SQL0440N 找不到具有兼容自变量的类型为 例程类型 的名为 例程名 的已授权例程。
SQL Server 2008是微软的SQL Server数据库中的最新版本,在该版本的数据库产品中融入了更多商业智能的内容。本书中也使用了一篇专门讲解了与商业智能有关的一些内容。 本书总分为5篇,共21章。第一篇主要讲解数据库...
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...
以下示例采用MS Query在“查询”工作簿中查询关闭的“销售”工作簿中sheet1的指定 “店铺”和指定“颜色”的内容(sheet1有“店铺”、“数量”、“颜色”等字段名及若干数据)。 操作前请先确定是否安装有MS Query。...
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前...
3.2 SQL Server中的数据库 3.3 决定数据库系统类型 3.4 收集数据 3.5 决定要存储在数据库中的信息 3.6 外部信息和忽略的信息 3.7 建立关系 3.8 规范化 3.9 创建示例数据库 3.10 小结 ...
两个都是有效子查询示例,用于检索产品型号为长袖标志运动衫且 ProductModelID 编号在 Product 和 ProductModel 两个表中相匹配的每种产品名称的实例。 USE AdventureWorks ; GO SELECT DISTINCT Name FROM ...
LIKE可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。性能肯定大大提高。...
经典SQL语句大全 下列语句部分是Mssql语句,不可以在access中使用。... Set 对象变量名=连接对象.Execute("SQL 查询语言") Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录...
第十掌 分解复杂查询,用常量代替变量 7 第十一掌 like子句尽量前端匹配 7 第十二掌 用Case语句合并多重扫描 7 第十三掌 使用nls_date_format 8 第十四掌 使用基于函数的索引 8 第十五掌 基于函数的索引要求等式匹配...
否定的SQL 比较运算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL: (注意,按英语习惯用 is not,而不是 not is) NOT 与 IN 在一起使用时,NOT 是找出与条件列表不匹配的行。 IN 列表里有 NULL 时不处理...
第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值) a. select pin , name from people where pin = :blk1.pin; select pin , name from people ...
SQL中变量 SQL中的事务 创建存储过程 存储过程带输出参数 调用存储过程 触发器定义 触发器类型: 触发器触发条件: 什么是索引 索引类型 什么是填充因子 什么是临时表 什么是局部临时表 什么是全局临时表 什么是三层...
SQL server 中的变量分为两种,全局变量和局部变量。其中全局变量的名称以________ 字符开始,有系统定义和维护。局部变量以 _________ 字符开始,由用户自己定义和赋值。 一个事务的操作必须是具备以下四个属性:...