原来我也不用,大段大段的SQL语句,直接写在代码里,后来知道了存储过程,发现这样值参数,效率挺高的。
但现在遇到了问题。就是查询的时候,有很多筛选条件的话,拿 搜人来打个比方
"人"表,可以有 姓名、性别、年龄、学历、所在地、工资……这些字段
默认情况下,用户搜"姓名"即可搜出N多人,可以加筛选条件,年龄、学历等。
原来在程序里写SQL语句,可以这样拼
select * from 人 where 姓名 like %某某%
用户有哪些筛选条件,可以加
and 年龄>20 and 年龄<30可现在改成存储过程的话,这种筛选条件,怎么加啊???
但现在遇到了问题。就是查询的时候,有很多筛选条件的话,拿 搜人来打个比方
"人"表,可以有 姓名、性别、年龄、学历、所在地、工资……这些字段
默认情况下,用户搜"姓名"即可搜出N多人,可以加筛选条件,年龄、学历等。
原来在程序里写SQL语句,可以这样拼
select * from 人 where 姓名 like %某某%
用户有哪些筛选条件,可以加
and 年龄>20 and 年龄<30可现在改成存储过程的话,这种筛选条件,怎么加啊???
解决方案 »
- DataColumnChangeEventArgs的数据格式的问题?
- GridView导出EXCEL后,GV里面的内容和EXCEL不一致
- vs05查看设计视图,状态栏一直显示"正在添加对对system.web.dll的引用"
- 慕白兄等刚才回答了权限问题的进
- 在asp.net中退出程序用哪个函数呀
- 又有100分等你来拿 关于DG
- 我打算学习.net技术,先问一个白痴问题
- 有没有比DataGrid更好的格子控件?
- an nuknown error occurred while processing the request on the server.the status code
- 怎样只打印下边框的内容?
- 在线等—求asp.net将.txt .xls文件内容读取并逐条写入数据库代码
- GridView1.Rows.Count - 1这种语句可以转换为Repeater类的吗?
set @where =@where+' and 姓名 like''%'+@姓名+'%'''......exec('select 姓名 from 人 '+@where+'')
SELECT 姓名,性别,年龄,学历
FROM 人
WHERE 姓名 like '%某某%' AND 年龄 BETWEEN 20 AND 30
...
ALTER PROCEDURE [dbo].[P_TEST]
@EmployeeName varchar(50) = '',
@EmployeeNo varchar(50) = ''
AS BEGIN
SELECT * FROM [T_ComparisonInfo] AS [Main] WITH(NOLOCK)
WHERE (@EmployeeName = '' OR [EmployeeName] = @EmployeeName)
AND (@EmployeeNo = '' OR [EmployeeNo] = @EmployeeNo)
END使用存储过程并不是那么神奇,他提升不了多少效率,没有太多意义。拼接SQL比存储过程多了个编译时间,但是几乎感觉不到。在拼接的SQL语句中一样可以使用许多函数,使用好的话,效率不比SQL慢。许多表,只可能在部分页面读写,代码与拼接SQL在一起,反而容易维护。数据量小,但是计算复杂的话,读出来后用C#处理结果比SQL快许多。
XXXXX
end
declare @sql nvarchar(300)
根据不同的参数拼接@sql
最后执行这个sql语句
exec sp_executesql @sql
(
@TableName varchar(50), --表名
@ReFieldsStr varchar(max), --字段名(全部字段为*)
@OrderString varchar(200), --排序字段(必须!支持多字段不用加order by)
@WhereString varchar(4000) --条件语句(不用加where)
)
AS
BEGIN
Declare @SqlString nvarchar(2000);
SET @SqlString = N' select '+@ReFieldsStr+' from '+ @TableName;
IF (@WhereString! = '' or @WhereString is not null)
BEGIN
SET @SqlString =@SqlString+ ' where 1=1 and '+ @WhereString;
END
BEGIN
SET @SqlString =@SqlString+ ' order by '+ @OrderString;
END
EXEC sp_executesql @SqlString
END
这样的东西和拼接SQL没什么不同,甚至更糟糕,因为大部分人都不会在存储过程里的拼接SQL过程中替换掉单引号,结果一样可以SQL注入……
!!
很多企业都需要套用模式来做的.唉.比如现在面试的.上来就问会不会MVC啊.会不会XX啊什么的
然后exec一下.
#2的写法在拼接的时候也要考虑到一些特殊字符之类的东西...
drop proc '存储过程名字'
go
create proc '存储过程名字'
as
select * from 人 where 姓名 like %某某% and 年龄>20 and 年龄<30
go
exec '存储过程名字'