回 帖 发 新 帖 刷新版面

主题:请问这种"动态字段"的存储过程写法.....?

我说的所谓"动态字段"是指:查询字段是不固字的,是可变的.
用存储过程描述如下:
@Field varchar(20),
@Value varchar(20)
AS
     select @Field from talbe1 where @Field=@Value
GO

请问要实现以上"存储过程描述"的存储过程能实现吗? 该如何写?

回复列表 (共12个回复)

沙发

你可以把@filed设为标志,根据不同值执行不同语句,比如
if @field='name'
begin
   select name from table where name=@value
end

板凳

这种办法我也考虑过,但不现实,因为:

1.@field的可能值有30或更多.
2.from之前有约2000字符,我在这里为了方便所以只写了select * from

如果按楼上的办法,那这个存储过程将会很长很长,对我来说有点不现实.

有没有其它办法?

3 楼

declare @sql varchar(600)
set @sql='select * from table'
exec (@sql)

用这样的方法动态写出sql语句

4 楼

这些SQL语句我是知道什么意思,但与楼主说的内容有什么关联吗,新手照顾一下!

5 楼

exec + 字符串,可以把字符串,当作SQL语句进行解析!~

6 楼

这样看行不行
create procedure pp 
@Field varchar(20) = '',
@Value varchar(20) = ''
AS
  begin
  declare @set varchar(300)
  @set = 'select'
  @set = @set + @Field
  @set = @set + 'from table1 where'
  @set = @set + ' '+@Field + '=' +@Value   
  exec(@set)
  end
GO

7 楼

create procedure pp 
@Fieldlist varchar(1000) = '',
@tablename varchar(100) = '',
@whereExpress varchar(256) = ''
AS
  begin
  declare @sqlstr varchar(1480);
  set @sqlstr = 'select '+ @Fieldlist;
  set @sqlstr = @sqlstr + ' from '+ @tablename;
  if @whereExpress is not null
    set @sqlstr = @sqlstr + ' where '+ @whereExpress;
  exec(@sqlstr)
  end
----------------------------------------------------------
调用方法:
exec pp 'sno,sname,sage','student',null  &&没有查询条件
或:
exec pp "sno,sname,sage","student","sname like '李%'"  &&有查询条件

8 楼

首先谢谢回贴!!

我试了7楼兄弟的办法,当字段列表为:
“id '序号'"
完全可行,没问题。

但当字段列表为:
“id '序号',convert(char(10),sdate,20) '完成日期',(case when sdate>='2006-01-01' then 'yes' else 'no' end) '完成'"
出现错误,提示为:实时错误‘3421’ 应用程序在当前操作中使用了错误类型的值。

请问如何写才好?

9 楼

“id '序号',convert(char(10),sdate,20) '完成日期',convert(char(3),(case when sdate>='2006-01-01' then 'yes' else 'no' end)) '完成'"
最后一个列为生成这字段,用convert()等于明确它的数据类型.

10 楼

谢谢jinlonggao兄,

不过我试了还是不行啊。


请指教!


我来回复

您尚未登录,请登录后再回复。点此登录或注册