SQLSERVER中可以将一类常用查询语句写成一个存储过程吗?

iou3344 2016-03-04 02:44:33
不知道如何表述我的意思,所以我举个例子吧,请高手们不要笑话我就好

下面是一段基本asp语句
<%
'通过接收用户输入,获取查询参数值
name= trim(request("name"))
sex = trim(request("sex"))
age = trim(request("age"))
depart = trim(request("depart"))
telphone = trim(request("telphone"))
city = trim(request("city"))
。。。。
%>
<%
'根据获取的参数值构造完sql语句
sql=select * from dtable where CONTAINS(name,'""" & name &"""')" and CONTAINS(city,'""" & city&"""')" 。。。。。
'由于用户输入的条件不定,所以sql是不一样的,但是基本的构造是这样的,并总是可以获得正确的sql语句
%>


'由于用户输入的条件不定,所以sql是不一样的,有时候是一个条件,有时候是5个条件,完全取决于用户自己输入的查询条件的情况,但是基本的构造是这样的(我已经在后台规范了不同条件的查询语句构造,并通过sql=sql& and CONTAINS(字段名,'""" & 字段值 &"""')" 的方式最终拼接成了最终的SQL语句),并总是可以获得正确的sql语句

==================华丽丽的分割线==========好了,背景交代完毕,重点来了啊===============

如果!!如果!!如果存储过程真的是神奇的,是不是一旦写出这样一个“通吃”上述各种不同条件的sql语句的存储过程,那么就可以大大大大大大大大大大提高不同用户的查询速度呢?其原因又是什么呢?

ps:我是刚刚才学习sqlserver,刚才看到存储过程就在想这个问题,如果可以,那说明存储过程真的好神奇
...全文
390 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2016-03-10
  • 打赏
  • 举报
回复
USE MASTER
GO
IF OBJECT_ID('dbo.Proc_Test','P') IS NOT NULL
DROP PROC dbo.Proc_Test
GO
CREATE PROC dbo.Proc_Test
@name NVARCHAR(50),@create_date DATETIME
AS
BEGIN
SET NOCOUNT ON
DECLARE @sql NVARCHAR(MAX)
SET @sql='SELECT * FROM sys.tables AS t WHERE 1=1'
IF ISNULL(@name,'')!=''
BEGIN
SET @sql=@sql+' and t.name like ''%''+@name+''%'' '
END
IF @create_date IS NOT NULL
BEGIN
SET @sql=@sql+' and t.create_date <= @create_date '
END

EXEC sp_executesql @sql,N'@name nvarchar(50),@create_date datetime',@name,@create_date
END
GO
--测试1:@name 有值
EXEC dbo.Proc_Test @name='fall',@create_date=NULL
--测试2:@create_date 有值
EXEC dbo.Proc_Test @name='',@create_date='2016-01-01'
--测试3:两参数均有值
EXEC dbo.Proc_Test @name='sp',@create_date='2015-01-01'

吉普赛的歌 2016-03-10
  • 打赏
  • 举报
回复
上面的做法, 基本满足了你的需求, 同时也避免了sql的复杂性问题
吉普赛的歌 2016-03-10
  • 打赏
  • 举报
回复
在满足需求的情况下, sql越短越好, 而不是越长越好——不要为了开发时的简单, 而导致执行时的缓慢。 过于复杂的sql, sqlserver在分析时很容易走一个错误的执行计划。 #6的这种方式, 也容易导致不走索引 此外, asp过时了, 推荐你学asp.net 或者 .net mvc
Ny-6000 2016-03-10
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
存储过程可以实现“通吃”上述各种不同条件的sql语句. 但不一定可以提高用户的查询速度, 主要看存储过程中动态拼接产生的SQL语句是否ok, 是否有对应的表索引等等.
如果应用服务器和数据库服务器,不在同一个物理服务器上 使用存储过程只传递可变的参数及值,可以减少网络传输内容,加快页面响应 另外就是存储过程安全性要高些,可以参数化传入的值 执行效率主要还看语句怎样写,及数据表,主键,索引等如何定义的了
iou3344 2016-03-08
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:
存储过程可以实现“通吃”上述各种不同条件的sql语句. 但不一定可以提高用户的查询速度, 主要看存储过程中动态拼接产生的SQL语句是否ok, 是否有对应的表索引等等.
这段总结的精辟!!
tcmakebest 2016-03-08
  • 打赏
  • 举报
回复
一直在用这种以不变应万变的写法,建议楼主参考一下,每个参数都有一个特殊值,让对应的OR条件为真. where (@age='' or 其他条件) and (@name='' or 其他条件) and ...
Ginnnnnnnn 2016-03-05
  • 打赏
  • 举报
回复
可以。封装成存储过程还有助于防止初步因为拼接语句不当被注入的风险。如果执行的语句很长很多。使用存储过程封装,也可以减少将语句传输到服务器的时间,提高性能。如果按照你上面这个例子,封装成存储过程使用动态语句拼接条件一般来说也是ok了
唐诗三百首 2016-03-05
  • 打赏
  • 举报
回复
存储过程可以实现“通吃”上述各种不同条件的sql语句. 但不一定可以提高用户的查询速度, 主要看存储过程中动态拼接产生的SQL语句是否ok, 是否有对应的表索引等等.
道素 2016-03-04
  • 打赏
  • 举报
回复
如果只是查询条件不用动态构造查询都可以,比如下面的语句,如果表名给的值为空,则那个条件就相当如没加(1=1) 如果有值就按值查询,其他逻辑判断同样处理

DECLARE @tablenname VARCHAR(100)--='sysrscols'
SELECT OBJECT_NAME(s.[object_id]),* FROM sys.[columns]  AS s  WHERE OBJECT_NAME(s.[object_id])=isnull(@tablenname,OBJECT_NAME(s.[object_id]))
shoppo0505 2016-03-04
  • 打赏
  • 举报
回复
从代码编写测试部署方面来说使用存储过程可以大大降低复杂程度和提高安全性. 至于性能, 如果语句相同不会有什么区别. 你这种情况的话,在数据库方面进行判断,在操作会简单很多.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧