朋友:你好 你这段程序确实有错. 1. id<>null不对,应该为 id is not null 2. 执行时参数代入格式不对,参数是条件 + 字符型值时,不能写成 "kfdh='1213123'",但可以写成"kfdh=1213123",系统会自动将1213123认为为字符型. 3. 执行动态SQL语句时格式不对, 应加括号,即 exec (@strpara) 4. 注意点(不是错误), 用户自定义存储过程的名称不要使用 sp_开头,sp_开头的存储过程为系统存储过程.以上程序修改如下: CREATE PROCEDURE hgp_select @strpara varchar(50) AS set @strpara="select * from HGP where id is not null and " + @strpara exec (@strpara)exec hgp_select "kfdh=1213123"
guoyiqian,谢谢指点. 但问题该没彻底解决, 如果@strpara包含多个条件, 如:"col1=11212 and col2=112", 则无法正确执行,还请帮忙看看,多谢!
withhold:你好! 如果@strpara包含多个条件且条件个数不知的情况下,可以有二种方法解决该问题. 方法一:通过DB-Library编程,动态生成存储过程.我以前在SYBASE数据库下使用过,但该方法要有C编程经验,同时要熟悉DB-Library,比较难使用.我建议你使用方法二.方法二:我猜想你应该是前台使用种数据库开发工具(PB,VB或其它),后台使用SQL SERVER数据库. 而多条件是由前台决定的. 若是这种类型,则: 第一步,你可以在后台建立一个专门存放条件的表.表结构为 CREATE TABLE dbo.cond (condition varchar(2000) NOT NULL, iden_id int IDENTITY NOT NULL --系统流水号,读写数据时不要理会该字段 , CONSTRAINT cond_p PRIMARY KEY NONCLUSTERED (iden_id)) ; 前台决定好的条件先在前台动态拼接好,如 where col1='abc' and col2='efg' and id=50,将拼接好的条件存放到条件表中 . 第二步,建立存储过程 CREATE PROCEDURE hgp_select AS declare @strsql varchar(2000), @condition varchar(2000) select @condition = condition from cond set @strsql="select * from HGP " + @condition exec (@strsql)调用该存储过程: exec hgp_select细节注意点:1. 应考虑系统是多用户的,该程序必须允许多个人同时选择不同条件,同时得到各自的所需数据,所以在条件表最好再加上一个操作员(注:不同人执行该程序,应该为不同的操作人员),这样可以区分条件是谁的.在存储过程中,同样要有操作人员. 2. 在存储过程中拼接条件时,即做select @condition = condition from cond set @strsql="select * from HGP " + @condition动作时,应该判断条件表中是否取到了条件.因为 变量 + Null = Null很高兴我们能相互探讨问题.有空联系
你这段程序确实有错.
1. id<>null不对,应该为 id is not null
2. 执行时参数代入格式不对,参数是条件 + 字符型值时,不能写成 "kfdh='1213123'",但可以写成"kfdh=1213123",系统会自动将1213123认为为字符型.
3. 执行动态SQL语句时格式不对, 应加括号,即 exec (@strpara)
4. 注意点(不是错误), 用户自定义存储过程的名称不要使用 sp_开头,sp_开头的存储过程为系统存储过程.以上程序修改如下:
CREATE PROCEDURE hgp_select
@strpara varchar(50)
AS
set @strpara="select * from HGP where id is not null and " + @strpara
exec (@strpara)exec hgp_select "kfdh=1213123"
但问题该没彻底解决,
如果@strpara包含多个条件,
如:"col1=11212 and col2=112",
则无法正确执行,还请帮忙看看,多谢!
如果@strpara包含多个条件且条件个数不知的情况下,可以有二种方法解决该问题.
方法一:通过DB-Library编程,动态生成存储过程.我以前在SYBASE数据库下使用过,但该方法要有C编程经验,同时要熟悉DB-Library,比较难使用.我建议你使用方法二.方法二:我猜想你应该是前台使用种数据库开发工具(PB,VB或其它),后台使用SQL SERVER数据库.
而多条件是由前台决定的. 若是这种类型,则:
第一步,你可以在后台建立一个专门存放条件的表.表结构为
CREATE TABLE dbo.cond
(condition varchar(2000) NOT NULL,
iden_id int IDENTITY NOT NULL --系统流水号,读写数据时不要理会该字段
, CONSTRAINT cond_p
PRIMARY KEY NONCLUSTERED
(iden_id)) ;
前台决定好的条件先在前台动态拼接好,如 where col1='abc' and col2='efg' and id=50,将拼接好的条件存放到条件表中 .
第二步,建立存储过程
CREATE PROCEDURE hgp_select
AS
declare @strsql varchar(2000), @condition varchar(2000)
select @condition = condition from cond
set @strsql="select * from HGP " + @condition
exec (@strsql)调用该存储过程: exec hgp_select细节注意点:1. 应考虑系统是多用户的,该程序必须允许多个人同时选择不同条件,同时得到各自的所需数据,所以在条件表最好再加上一个操作员(注:不同人执行该程序,应该为不同的操作人员),这样可以区分条件是谁的.在存储过程中,同样要有操作人员.
2. 在存储过程中拼接条件时,即做select @condition = condition from cond
set @strsql="select * from HGP " + @condition动作时,应该判断条件表中是否取到了条件.因为 变量 + Null = Null很高兴我们能相互探讨问题.有空联系