CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  疑难问题

请教专家MSSQL存储过程的问题

楼主zhouyao_99(周耀)2006-06-01 15:45:36 在 MS-SQL Server / 疑难问题 提问

以下是存储过程代码,在delphi中复杂查询要调用它的结果集  
  create   procedure   find_employee  
        @id   char(8),  
        @name   nvarchar(8),  
        @title   nvarchar(16),  
  as  
        select   *   from   employee   where   (id   =   @id)   AND   (name   =   @name)   AND   (title   =   @title)  
  go  
  我的问题是怎样通过外部输入的参数改变select语句的连接操作符AND,比如输入'AND'还是AND,输入'OR'就变成OR。我试过用字符变量替换但不行,如果在存储过程中用if条件来选择select语句,delphi提示不能返回结果集  
   
  问题点数:60、回复次数:7Top

1 楼WangZWang(先来)回复于 2006-06-01 15:48:43 得分 20

--用动态语句,如:  
  create   procedure   find_employee  
        @id   char(8),  
        @name   nvarchar(8),  
        @title   nvarchar(16),  
        @orAnd   nvarchar(20)  
  as  
        exec('  
            select   *   from   employee   where   (id   =   '+@id+')   '+@orAnd+'  
                (name   =   '''+@name+''')   '+@orAnd+'   (title   =   '''+@title+'''')  
  go  
  Top

2 楼xeqtr1982(Visual C# .NET)回复于 2006-06-01 15:53:02 得分 10

alter   procedure   find_employee  
        @id   char(8),  
        @name   nvarchar(8),  
        @title   nvarchar(16),  
        @t   varchar(3)  
  as  
   
  declare   @sql   varchar(8000)  
  set   @sql='select   *   from   employee   where   (id   =   '+rtrim(@id)+')   '+@t+'   (name   =   '''+@name+''')   '+@t+'   (title   =   '''+@title+''')'  
  exec(@sql)  
  go  
   
  exec   find_employee   '1','a','b','and'  
  exec   find_employee   '1','a','b','or'Top

3 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-01 15:53:30 得分 10

用動態SQL語句  
   
  create   procedure   find_employee  
        @id   char(8),  
        @name   nvarchar(8),  
        @title   nvarchar(16),  
        @str     nvarchar(10)  
  as  
  Declare   @S   Nvarchar(4000)  
  Set   @S='select   *   from   employee   where   (id   =   '''+Rtrim(@id)+''')   '+@str+'   (name   =   '''+@name+''')   '+@str+'   (title   =   '''+@title+''')'''  
  EXEC(@S)  
  go  
  Top

4 楼paoluo(一天到晚游泳的鱼)回复于 2006-06-01 15:54:21 得分 0

哈,慢了Top

5 楼xeqtr1982(Visual C# .NET)回复于 2006-06-01 15:55:16 得分 0

如果需要前后的运算符不同,那么可以定义2个变量Top

6 楼wangtiecheng(不知不为过,不学就是错!)回复于 2006-06-01 15:55:57 得分 20

--用动态语句,如:  
  create   procedure   find_employee  
        @id   char(8),  
        @name   nvarchar(8),  
        @title   nvarchar(16),  
        @orAnd   nvarchar(20)  
  as  
        declare   @sql   nvarchar(8000)  
        exec('select   *   from   employee   where   (id   =   '   +   @id   +   ')'   +   @orAnd   +   '(name   '''   +   @name   +   ''')   '   +   @orAnd   +   '   (title   =   '''   +   @title   +   '''')  
   
  go  
   
   
  --------------------------------------------------------------------------------  
   
  动态sql语句基本语法    
  1   :普通SQL语句可以用Exec执行    
   
  eg:       Select   *   from   tableName    
                    Exec('select   *   from   tableName')    
                    Exec   sp_executesql   N'select   *   from   tableName'         --   请注意字符串前一定要加N    
   
  2:字段名,表名,数据库名之类作为变量时,必须用动态SQL    
   
  eg:        
  declare   @fname   varchar(20)    
  set   @fname   =   'FiledName'    
  Select   @fname   from   tableName                             --   错误,不会提示错误,但结果为固定值FiledName,并非所要。    
  Exec('select   '   +   @fname   +   '   from   tableName')           --   请注意   加号前后的   单引号的边上加空格    
   
  当然将字符串改成变量的形式也可    
  declare   @fname   varchar(20)    
  set   @fname   =   'FiledName'   --设置字段名    
   
  declare   @s   varchar(1000)    
  set   @s   =   'select   '   +   @fname   +   '   from   tableName'    
  Exec(@s)                                 --   成功    
  exec   sp_executesql   @s       --   此句会报错    
   
   
   
  declare   @s   Nvarchar(1000)     --   注意此处改为nvarchar(1000)    
  set   @s   =   'select   '   +   @fname   +   '   from   tableName'    
  Exec(@s)                                 --   成功            
  exec   sp_executesql   @s       --   此句正确    
   
  3.   输出参数    
  declare   @num   int,    
                  @sqls   nvarchar(4000)    
  set   @sqls='select   count(*)   from   tableName'    
  exec(@sqls)    
  --如何将exec执行结果放入变量中?    
   
  declare   @num   int,    
                                @sqls   nvarchar(4000)    
  set   @sqls='select   @a=count(*)   from   tableName   '    
  exec   sp_executesql   @sqls,N'@a   int   output',@num   output    
  select   @num    
   
   
   
  Top

7 楼zhouyao_99(周耀)回复于 2006-06-02 08:33:07 得分 0

谢谢大家!MSSQL论坛的人总是很热心,我还有一个小问题SQL   Server   2000   Enterprise装在Win2003   Enterprise下本机可正常运行,远程的客户无法访问它,我用netstat   -na发现服务器的1433端口没有打开,在SQL   Server的'服务器实用工具'中查看端口是1433,我只有SQL   Server   2000并想装在Win2003   Enterprise能办到吗?谢谢各位高人!Top

相关问题

关键词

得分解答快速导航

  • 帖主:zhouyao_99
  • WangZWang
  • xeqtr1982
  • paoluo
  • wangtiecheng

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo