日期:2014-05-17  浏览次数:20388 次

请教,存储过程中select *和通用性的冲突
菜鸟一只,问的问题可能不行,敬请大神回答。

对于一个菜鸟来说,总是想偷懒简便一些,于是将表的“查询”功能,写一个存储过程。
无论是单条查询或者批量查询,都使用这个存储过程

这样就出现一个问题:
1、如果写select * (重点是这个*号)
——好像消耗资源过多
——尤其是看到很多大神都说,绝对不要使用select *
2、如果不写select *
——对于一个表,在不同的查询时(尤其是复杂的表做KPI分析报表),记录集中的字段可能不够。

自己想的解决方案:
1、不同地方使用的查询,写不同的存储过程,这样就可以写select 字段1,字段2,字段3 from 表
——但是对于复杂的大表来说,所需要做的数据分析类型很多,难道一种查询写一个……?
2、依然使用同一个存储过程,将 select 字段1,字段2,字段3 from 表 中的 字段1,字段2,字段3作为存储过程的入参,拼接一下SQL语句
——但是对于字段多的表来说,select的字段是一部分入参,条件又是一部分入参。会不会太多入参了……

不知道各位大神怎么解决这方面的矛盾?

不知道问题描述得是否清楚……?下面贴一段存储过程……


ALTER PROCEDURE [dbo].[存储过程名]
@top_number nvarchar(10),
@id nvarchar(20),
@basic_store_cn nvarchar(40),
@basic_store_en nvarchar(80),
@basic_code nvarchar(20),
@basic_name nvarchar(40),
@basic_unit nvarchar(10),
@basic_unitprice nvarchar(38),
@mark_display nvarchar(4)
AS

declare @sql varchar(max)

BEGIN
set @sql=' SELECT '

if (@top_number<>'跳过')
BEGIN
set @sql=@sql+' top '+@top_number+' '
end

set @sql=@sql+' * FROM 表 '
set @sql=@sql+' where 字段mark_display='''+@mark_display+''' '

if (@id<>'跳过')
BEGIN
set @sql=@sql+' and 字段id='+@id+' '
end

if (@basic_store_cn<>'跳过')
BEGIN
set @sql=@sql+' and 字段basic_store_cn='''+@basic_store_cn+''' '
end

if (@basic_store_en<>'跳过')
BEGIN
set @sql=@sql+' and 字段basic_store_en='''+@basic_store_en+''' '
end

if (@basic_code<>'跳过')
BEGIN
set @sql=@sql+' and 字段basic_code='+@basic_code+' '
end

if (@basic_name<>'跳过')
BEGIN
set @sql=@sql+' and 字段basic_name='''+@basic_name+''' '
end

if (@basic_unit<>'跳过')
BEGIN
set @sql=@sql+' and 字段basic_unit='''+@basic_unit+''' '
end

if (@basic_unitprice<>'跳过')
BEGIN
set @sql=@sql+' and 字段basic_unitprice='''+@basic_unitprice+''' '
end

set @sql=@sql+' order by 字段basic_code asc '
EXEC(@sql)
END