`
shmilylq
  • 浏览: 56196 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
sxu
文章分类
社区版块
存档分类
最新评论

SQL中带变量的LIKE比较查询

阅读更多

是关于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用法详解SQL语句 SELECT LIKE like用法详解SQL语句 SELECT LIKE like用法详解

    sqlserver 局部变量的使用

    代码如下: 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 中使用两个变量 下例从 ...

    在sp_executesql中使用like字句的方法

    –把LikeSql变量赋值,可以赋值成’%xxxxxxxxxxxx%’ declare @SelectSql nvarchar(128)–定义Sql语句,开始拼Sql set @SelectSql = ‘select * from Table where [Column] like @LikePar’;—使用@LikePar变量进行...

    精通SQL--结构化查询语言详解

    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 ...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    精通sql结构化查询语句

    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 消息

    DB2 SQL 消息,非常方便管理员与操作者查找以便解决错误.比如SQL0440N 找不到具有兼容自变量的类型为 例程类型 的名为 例程名 的已授权例程。

    21天学会SQL

    SQL Server 2008是微软的SQL Server数据库中的最新版本,在该版本的数据库产品中融入了更多商业智能的内容。本书中也使用了一篇专门讲解了与商业智能有关的一些内容。 本书总分为5篇,共21章。第一篇主要讲解数据库...

    经典SQL语句大全

    注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际...

    数据透视表SQL语句入门

    以下示例采用MS Query在“查询”工作簿中查询关闭的“销售”工作簿中sheet1的指定 “店铺”和指定“颜色”的内容(sheet1有“店铺”、“数量”、“颜色”等字段名及若干数据)。 操作前请先确定是否安装有MS Query。...

    SQL 优化原则

     在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前...

    SQL Server2005基础教程

     3.2 SQL Server中的数据库  3.3 决定数据库系统类型  3.4 收集数据   3.5 决定要存储在数据库中的信息  3.6 外部信息和忽略的信息  3.7 建立关系  3.8 规范化  3.9 创建示例数据库  3.10 小结 ...

    SQL示例大全.pdf

    两个都是有效子查询示例,用于检索产品型号为长袖标志运动衫且 ProductModelID 编号在 Product 和 ProductModel 两个表中相匹配的每种产品名称的实例。 USE AdventureWorks ; GO SELECT DISTINCT Name FROM ...

    SQL性能优化

     LIKE可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。性能肯定大大提高。...

    经典全面的SQL语句大全

    经典SQL语句大全 下列语句部分是Mssql语句,不可以在access中使用。... Set 对象变量名=连接对象.Execute("SQL 查询语言")  Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录...

    SQL查询语句优化总结

    第十掌 分解复杂查询,用常量代替变量 7 第十一掌 like子句尽量前端匹配 7 第十二掌 用Case语句合并多重扫描 7 第十三掌 使用nls_date_format 8 第十四掌 使用基于函数的索引 8 第十五掌 基于函数的索引要求等式匹配...

    2009达内SQL学习笔记

    否定的SQL 比较运算符: NOT BETWEEN; NOT IN; NOT LIKE; IS NOT NULL: (注意,按英语习惯用 is not,而不是 not is) NOT 与 IN 在一起使用时,NOT 是找出与条件列表不匹配的行。 IN 列表里有 NULL 时不处理...

    ORACLE SQL性能优化系列

    第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值) a. select pin , name from people where pin = :blk1.pin; select pin , name from people ...

    数据库和ado知识

    SQL中变量 SQL中的事务 创建存储过程 存储过程带输出参数 调用存储过程 触发器定义 触发器类型: 触发器触发条件: 什么是索引 索引类型 什么是填充因子 什么是临时表 什么是局部临时表 什么是全局临时表 什么是三层...

    黄淮学院2010学年第二学期SQL server期末考试

    SQL server 中的变量分为两种,全局变量和局部变量。其中全局变量的名称以________ 字符开始,有系统定义和维护。局部变量以 _________ 字符开始,由用户自己定义和赋值。 一个事务的操作必须是具备以下四个属性:...

Global site tag (gtag.js) - Google Analytics