主题:请问这种"动态字段"的存储过程写法.....?
阿平~~
[专家分:170] 发布于 2006-12-21 09:52:00
我说的所谓"动态字段"是指:查询字段是不固字的,是可变的.
用存储过程描述如下:
@Field varchar(20),
@Value varchar(20)
AS
select @Field from talbe1 where @Field=@Value
GO
请问要实现以上"存储过程描述"的存储过程能实现吗? 该如何写?
回复列表 (共12个回复)
沙发
Mcemil [专家分:1970] 发布于 2006-12-21 14:32:00
你可以把@filed设为标志,根据不同值执行不同语句,比如
if @field='name'
begin
select name from table where name=@value
end
板凳
阿平~~ [专家分:170] 发布于 2006-12-21 14:44:00
这种办法我也考虑过,但不现实,因为:
1.@field的可能值有30或更多.
2.from之前有约2000字符,我在这里为了方便所以只写了select * from
如果按楼上的办法,那这个存储过程将会很长很长,对我来说有点不现实.
有没有其它办法?
3 楼
Mcemil [专家分:1970] 发布于 2006-12-24 13:23:00
declare @sql varchar(600)
set @sql='select * from table'
exec (@sql)
用这样的方法动态写出sql语句
4 楼
lgt9732 [专家分:170] 发布于 2006-12-29 10:37:00
这些SQL语句我是知道什么意思,但与楼主说的内容有什么关联吗,新手照顾一下!
5 楼
233238447 [专家分:1350] 发布于 2006-12-31 00:09:00
exec + 字符串,可以把字符串,当作SQL语句进行解析!~
6 楼
lgt9732 [专家分:170] 发布于 2006-12-31 11:33:00
这样看行不行
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 楼
jinlonggao [专家分:17130] 发布于 2007-01-01 18:55:00
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 楼
阿平~~ [专家分:170] 发布于 2007-01-13 11:01:00
首先谢谢回贴!!
我试了7楼兄弟的办法,当字段列表为:
“id '序号'"
完全可行,没问题。
但当字段列表为:
“id '序号',convert(char(10),sdate,20) '完成日期',(case when sdate>='2006-01-01' then 'yes' else 'no' end) '完成'"
出现错误,提示为:实时错误‘3421’ 应用程序在当前操作中使用了错误类型的值。
请问如何写才好?
9 楼
jinlonggao [专家分:17130] 发布于 2007-01-13 15:58:00
“id '序号',convert(char(10),sdate,20) '完成日期',convert(char(3),(case when sdate>='2006-01-01' then 'yes' else 'no' end)) '完成'"
最后一个列为生成这字段,用convert()等于明确它的数据类型.
10 楼
阿平~~ [专家分:170] 发布于 2007-01-15 14:03:00
谢谢jinlonggao兄,
不过我试了还是不行啊。
请指教!
我来回复