sql存储过程where条件in字符串参数
⼀、使⽤  sp_executesql  系统存储过程执⾏  Unicode  字符串
  1、直接组合  SQL  语句执⾏
  CREATE  PROCEDURE  p_Test1
  @TableName  varchar(20)
  AS
  declare  @SQLString  nvarchar(200)
  set  @SQLString  =  N 'select  *  from  '  +  @TableName
  EXECUTE  sp_executesql  @SQLString
  2、SQL  语句⾥包含嵌⼊参数
  CREATE  PROCEDURE  p_Test2
parameter数据类型  @TableName  varchar(20),
  @UserID  int,
  @UserName  varchar(50)
  AS
  declare  @SQLString  nvarchar(200)
  set  @SQLString  =  N 'select  *  from  '  +
  @TableName  +
  N '  where  UserID=@UserID  or  UserName=@UserName '
  EXECUTE  sp_executesql  @SQLString,
  N '@UserID  int,  @UserName  varchar(50) ',
  @UserID,  @UserName
  这也是  Microsoft  SQL  Server  的推荐做法。
  ⼆、使⽤EXECUTE语句执⾏字符串
  CREATE  PROCEDURE  p_Test3
  @TableName  varchar(20)
  AS
  declare  @SQLString  nvarchar(200)
  set  @SQLString  =  N 'select  *  from  '  +  @TableName
  EXEC(@SQLString)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------Varchar(500)
Declare@ParamIDList Varchar
Set @ ParamIDList=’张三,李四,王五’
Select 姓名,性别,年龄 From  Persons where Name In(@ ParamIDList)
这样写 ,数据库分析成为了
Select姓名,性别,年龄From where Name =@ ParamIDList
(和上⾯的语句是等价的)
这样情况的原因是因为数据库不会去分析变量中的, 号,并将变量拆分开来重新组合成新的SQL语句。
⽬录:
.0Table 变量和临时表,数据库中的表的区别和相同点
.0解决上⾯问题的两种途径
2.1 使⽤ Exec(SQL命令字符串)的⽅式 动态的返回数据
2.2 使⽤Table数据类型⽅式解决
1.0  Table 变量和临时表,数据库中的表的区别和相同点
Table变量的概念
Table变量是⼀种特殊的数据类型,在SQL程序中可以将多维的信息零时的保存到Table变量中,供后续处理,该数据类型保存数据的形式为⼀组⾏,这些⾏将可作为表值函数的结果集返回。
Table 变量不能作为 存储过程,和⾃定义函数的变量
临时表
由会话创建于tempdb 数据库的 sysobjects 表中的临时表 ,
Table和临时表,数据库中表的区别:
对SQL语句的⽀持
Table 变量
对于表的列的约束类型仅仅为PRIMARY KEY、UNIQUE KEY 和 NULL
INSERT INTO table_variable EXEC 存储过程。
⽀持基本的SELECT、INSERT、UPDATE 和 DELETE基本的表操作语句
临时表和数据库中实际的表 对表的语句的⽀持是⼀致(全部⽀持)。
实际的存储位置和⽣存的时间
Table 对象 和其他的类型的变量⽣成的周期是⼀样的,有明确的作⽤域,在超过作⽤域时系统⾃动的删除Table对象。
Table 对象实际上和其他类型的变量⼀样保存在内存中
临时表和数据库中的表都存储在实际的数据库中
临时表 #TableName的作⽤域是当前的会话中
##TableName 的作⽤域为全局量
2.0解决上⾯问题的两种途径
2.1 使⽤ Exec(SQL命令字符串)的⽅式 动态的返回数据
Varchar(1000)
Declare@Command  Varchar
Varchar(500)
Declare@ParamIDList Varchar
Set @ ParamIDList=’张三,李四,王五’
Set@Command=’Select 姓名,性别,年龄 From  Persons where Name In(’+@ ParamIDList+’)’
Exec(@Command )
2.2 使⽤Table数据类型⽅式解决
/**/ /* 根据输⼊的@ParamIDList列表来⽣Name列表*/
500)
Declare  @ParamIDList Varchar( 500
20))  --  建⽴表变量
D eclare @Table_NameList  table  ( Name Varchar( 20
Declare  @Index_Param int /**/ /*参数 记录分隔符的位置*/
500)  /**/ /*参数 没有处理的字符串*/
Declare  @NeedParse varchar( 500
Select  @Index_Param = CharIndex ( ' , ' ,  @ParamIDList )
if  ( @Index_Param = 00)
begin  /**/ /*⼀个名字组成*/
insert  into  @Table_NameList  (Name)  values ( @ParamIDList )
end
else  /**/ /*存在多个名字*/
begin
set  @NeedParse = @ParamIDList
while  ( CharIndex ( ' , ' ,  @NeedParse )> 00)
begin
insert  into  @Table_NameList(Name)  values ( SubString ( @BeginString , 11, CharIndex ( ' , ' , @BeginString )- 11))
set  @NeedParse = SubString ( @NeedParse , CharIndex ( ' , ' ,  @NeedParse )+ 11, len ( @NeedParse )- CharIndex ( ' , ' ,
@NeedParse ))
end
insert  into  @Table_NameList  (Name)  values ( @NeedParse )
end
Select  姓名,性别,年龄  From  Persons  where  Name In( select  Name  from  @Table_NameList )

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。