让存储过程与拼sql语句具有一样的灵活性

遇到一个问题,在csdn中各位大虾的帮助下,终于解决了。

http://topic.csdn.net/u/20071020/14/a3c1ec2e-3592-4ec5-9f16-38f11e178925.html?1064326859

下面的总结,摘取了csdn各位大虾的思想。

特总结一下:

以前在asp时代,最常见的访问数据库的方式就是在asp页面中拼sql,然后访问数据库(我目前就是使用这种方式)。而现在一般在asp.net开发中。要大量使用存储过程访问数据库。使用存储过程的好处不言而喻。下面就对比一下灵活使用变量的存储过程与以往的拼sql语句的方式。

表结构:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[t_student](
[id] [int] NOT NULL,
[name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[age] [int] NULL,
[address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_t_student] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

数据:
INSERT INTO [dbo].[t_student] ([id],[name],[age],[address]) VALUES(1, 'tom ',12, '北京市海淀区 ')
INSERT INTO [dbo].[t_student] ([id],[name],[age],[address]) VALUES(2, 'jim ',40, '上海 ')
INSERT INTO [dbo].[t_student] ([id],[name],[age],[address]) VALUES(3, 'roles ',10, 'beijing ')

需求:从数据库中查询数据的时候可以输入查询条件,也可以不输入任何查询条件。

以前的开发模式:

一般的情况下在代码拼sql语句取得数据的话,可以灵活的实现:     
string strsql = " select * from t_student where 1=1 ";
if(id != null)

 strsql =  strsql + " AND id=  '" + id + " '" ;
if(name != null)
 strsql =  strsql + " AND name=  '" + name + " '" ;
if(age != null)
 strsql = strsql + " and age = " + age ; 
if(address != null)
 strsql = strsql + " and address =  '" + address + " '" ;
 有了sql语句后面就可以使用ado.net中的对象把数据取出来了。

使用存储过程(可以只输入id,即可查询出数据):

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

create proc [dbo].[sp_test]
@id  int,
@name varchar(50),
@age int,
@address varchar(100)

as
 declare @sql varchar(1000)
begin

 set @sql='select * from t_student where 1=1 '
 if @id is not null
  set @sql = @sql + ' and id = ' + cast(@id as varchar(100)) --凡是数值型的变量,先转换为字符型,再连接到SQL串中
 if @name is not null
  set @sql = @sql + ' and name=''' + @name + ''''
 if @age is not null
  set @sql = @sql + ' and age=' + cast(@age as varchar(10)) --凡是数值型的变量,先转换为字符型,再连接到SQL串中
 if @address is not null
  set @sql = @sql + ' and address like ''%' + @address + '%'''
print(@sql)
exec (@Sql)

end

在执行该存储过程的时候,如果不输入参数,就查询出所有记录。如果输入了id或name或age或address条件后,可以根据输入的任何条件进行查询。

下面总结三种方法:

SQL code--1,若是采用动态语句
declare @sql varchar(1000)
set @sql='select * from tb where 1=1 '
if @p1 is not null
 
set @sql=@sql + ' and field1=' + @p1
if @p2 is not null
 
set @sql=@sql + ' and field2=' + @p2

--2,若是采用的非动态语句

select * from tb
 
where field1=case when @p1 is null then field1 else @p1 end
      
and field2=case when @p2 is null then field2 else @p2 end


--3,使用c#代码

string sql="select * from tb where 1=1 ";
if(Request["p1"]!=null)
{
  sql
+= " and field1='" + Request["p1"].ToString() + "'";
}
if(Request["p2"]!=null)
{
  sql
+= " and field2='" + Request["p2"].ToString() + "'";
}
//这样做不太好,需要对 Request的参数做安全性检测

 

注意:有一种误解关于绑定变量的方法。

strsql="select * from t where 1=1 and id=@p"
这样当@p为null时
执行的是 select * from t where id is null

而查询的本意是:

当@p为null时
执行的是 select * from t  --即不检索id=@p这个条件.

posted @ 2008-08-08 09:54  gby630  阅读(2082)  评论(1编辑  收藏  举报