SQL 数据库中的存储过程的参数问题

   1、SQL 数据库中的存储过程的参数问题

  怎么将SQL数据库中的存储过程中的参数既作为输出变量又作为输出变量?

  [sql] view plaincopy --drop proc proc_test

  --go

  create proc dbo.proc_test

  @in int,

  @out int out,

  @in_out int output

  as

  select @out = @in + @in_out, --1 + 2 = 3

  @in_out = @out + 1 --3 + 1 = 4

  go

  declare @in_p int

  declare @out_p int

  declare @in_out_p int

  set @in_p = 1;

  set @in_out_p = 2

  exec dbo.proc_test @in_p,

  @out_p out,

  @in_out_p output

  select @in_p, --输入参数

  @out_p, --输出参数

  @in_out_p --输入,输出参数

  /*

  (无列名) (无列名) (无列名)

  1 3 4

  */

  2、在存储过程中的参数问题。

  下面是问题:

  [sql] view plaincopy create table #tableTest(id int identity , name varchar(20),age int)

  go

  insert into #tableTest

  select '小明',23 union all

  select '小红',28 union all

  select '小军',27

  go

  select *from #tableTest

  go

  create proc procTest

  @name varchar(20),

  @age int,

  @IDs varchar(30)

  as

  begin

  select *from #tableTest where 1=1

  end

  --当我传入@name参数等于 小明,23岁,还有ID在(1,3)的时候

  --我怎么可以弄成可选的参数

  --比如,name不为空时候

  select *from #tableTest where 1=1 and name like '小明'

  --如果name参数为空的时候,IDs参数不为空的时候

  select *from #tableTest where 1=1 and id in(1,3)

  --请问一下,就有参数不为空的时候存储过程中的SQL追加条件,为空的时候就不追加,这样带可选参数的存储过程怎么写,以及怎么调用,请帮小弟写一个实例

  这种问题,本质上就是根据传入的参数不同,进行不同的查询,也就是where 后面的查询条件是动态的。

  一般有2中处理方式,一种就是写动态语句,但动态语句由于是动态拼接字符串,所以比较难维护,而且如果存储过程需要执行多次,那么每次都需要重新编译,但每次生成的执行计划,应该是比较优化的。但如果拼接字符串部分,只是少量的话,还是可以用动态语句的,下面我的解法就是用动态语句来实现的,结构清晰,易于维护。

  另一种,就是通过在where语句后面写case when来进行判断,这种方法的好处是不用动态拼接语句,但不易于理解,也不易于修改,因为别人不一定能理解你这么写的意思。另一个问题就是性能的问题,因为在原来的公司就用过这种方法,一段时间后,查询非常慢,本来几秒就能出结果,后来几分钟都出不了结果。说实在的,这种方法要求较高的技巧性,也容易出错,不建议使用。

  下面是我的解法,用了动态语句来实现,但考虑了维护、测试方面的要求:

  [sql] view plaincopy --drop table #tableTest

  create table #tableTest(id int identity , name varchar(20),age int,)

  go

  insert into #tableTest

  select '小明',23 union all

  select '小红',28 union all

  select '小军',27

  go

  select *from #tableTest

  go

  create proc procTest

  @name varchar(20)=null,@age int = null,@IDs varchar(30) = null

  as

  declare @sql nvarchar(max);

  set @sql = '';

  set @sql = 'select * from #tableTest where 1 = 1';

  set @sql = @sql +

  case when @name is not null

  then ' and name like ' + QUOTENAME(@name +'%','''')

  when @age is not null

  then ' and age = ' + cast(@age AS varchar)

  when @ids Is not null

  then ' and id in (' + @ids +')'

  else ' '

  end

  --打印出语句

  select @sql as '语句'

  --执行语句

  --exec(@sql)

  go

  exec procTest

  /*

  语句

  select * from #tableTest where 1 = 1

  */

  exec procTest '小明',23

  /*

  语句

  select * from #tableTest where 1 = 1 and name like '小明%'

  */

  exec procTest @ids = '2,3'

  /*

  语句

  select * from #tableTest where 1 = 1 and id in (2,3)

  */

  备注:如遇到需多个and参数连接查询,SQL语句可写如下

  SET @sql= @sql +

  CASE WHEN @SellerNick <> ''

  THEN ' and SellerNick = '+@SellerNick+' '

  ELSE ' '

  END

  SET @sql= @sql +

  CASE WHEN @LogisticsId <> ''

  THEN ' and LogisticsId = '+@LogisticsId+''

  ELSE ' '

  END

时间: 2024-11-02 06:29:07

SQL 数据库中的存储过程的参数问题的相关文章

在PL/SQL 开发中调试存储过程和函数的一般性方法

存储过程|函数 在PL/SQL 开发中调试存储过程和函数的一般性方法摘要: Oracle 在PLSQL中提供的强大特性使得数据库开发人员可以在数据库端完成功能足够复杂的任务, 本文将结合Oracle提供的相关程序包(package)以及一个非常优秀的第三方开发工具来介绍在PLSQL中开发及调试存储过程的方法,当然也适用于函数. 版权声明: 本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息.原文出处: http://www.aiview.com/notes/ora_using_

如何区分SQL数据库中的主键与外键_MsSql

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 用户表(用户名.密码.登录级别) 其中用户名是唯一的, 用户名就是一个主键 上机记录表(卡号,学号,姓名.序列号) 上机记录表中单一一个属性无法唯一标识一条记录,学号和姓名的组合才可以唯一标识一条记录,所以 学号和姓名的属性组是一个主键 上机记录表中的序列号不是成绩表的

如何区分SQL数据库中的主键与外键

一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键比如 : 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 用户表(用户名.密码.登录级别) 其中用户名是唯一的, 用户名就是一个主键 上机记录表(卡号,学号,姓名.序列号) 上机记录表中单一一个属性无法唯一标识一条记录,学号和姓名的组合才可以唯一标识一条记录,所以 学号和姓名的属性组是一个主键 上机记录表中的序列号不是成绩表的

sql server中扩展存储过程随笔(几个有用的PROCEDURE小总结)

server|存储过程 在sql server中扩展存储过程直接使用的机会不是很多 我把我知道的几个有用的扩展存储过程使用方式总结如下:     --获得MS SQL的版本号 execute master..sp_msgetversion go Character_Value                              -------------------- ----------- ----------- 8.00.760             1           3  

vs2010 数据的多选一-在VS2010环境下如何将excel数据导入到SQL数据库中的代码

问题描述 在VS2010环境下如何将excel数据导入到SQL数据库中的代码 类似于这种的导入方式的代码.有大神吗 解决方案 c#中高效的excel导入sqlserver的方法 http://wenku.baidu.com/link?url=swMSQLS3aD8QqkCckCokNOOsmqYphZ3nNL7Yeuq-e7K9Mz4UrLy92nGdLXV7IlUNFm9wXreVs7jAFgYtHBDbb1_TD3rOxOrxDKSr6QIDBIO

c#-如何把datagridview中的数据保存到SQL数据库中?VB.NET或C#

问题描述 如何把datagridview中的数据保存到SQL数据库中?VB.NET或C# 如下图:已经实现从EXCEL导入数据到Datagridview中,现在要把其中的数据保存到数据库的AAAie表里面.请用代码说明,谢谢. 解决方案 取数据用ado.net保存到SQL Server数据库.http://blog.csdn.net/lysc_forever/article/details/7697536 解决方案二: 方法1.创建一个数据库,表,表名自取,表的字段和Excel相同,取Excel

select-vs2010C#Web开发3个Dropdown控件从sql数据库中的4个表显示数据

问题描述 vs2010C#Web开发3个Dropdown控件从sql数据库中的4个表显示数据 实现效果:第一个下拉控件是选择学院,第二个下拉控件是选择系部,第三个下拉控件是选择班级.从网上找了个后台代码:前台: <%@ Page Language=""C#"" AutoEventWireup=""true"" CodeFile=""StudInfo.aspx.cs"" Inheri

c#-有什么好的方法把CSV格式导入到SQL数据库中?有代码更加好,或者指教思路也可以,感谢啦!

问题描述 有什么好的方法把CSV格式导入到SQL数据库中?有代码更加好,或者指教思路也可以,感谢啦! 有什么好的方法把CSV格式导入到SQL数据库中?有VB.NET或者C#代码更加好,或者指教思路也可以,感谢啦! 解决方案 1.用SQL自带的工具(导入导出数据)就可以2.不代码的话,每次读一行,按','进行Split成为一个数组,写入数据库就可以了 解决方案二: csv其实就是txt.你可以当成文本一行一行的处理.写数据库用ado.net就是了. 解决方案三: 代码就是一行行读取,用逗号作为格列

用友软件-求大神帮忙指点修改SQL数据库中所有特定字符串

问题描述 求大神帮忙指点修改SQL数据库中所有特定字符串 俺有一门水课,看着书一步步地照着做一个用友软件的项目,真的很无聊,记录公司发生的各种交易.我现在想把同学的作业拿过来改一下然后上交.这个用友软件用SQL数据库管理数据.这个用友软件,每个项目有一个账套主管,各种交易需要主管在软件里授权签名.现在我想做的是,首先修改账套主管名字,然而由于各个交易的签字信息不会随账套主管名字改变,我还得修改各个交易的签字. 直观的办法是,直接在SQL里搜索所有值为账套主管名字的字符串,然后替换成我的名字,求S