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 
  @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)


--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 Declare  @ParamIDList Varchar(500)
     Set @ ParamIDList=’张三,李四,王五’
    Select 姓名,性别,年龄 From  Persons where Name In(@ ParamIDList)



 

    这样写 ,数据库分析成为了

  Select姓名,性别,年龄From  Persons

(和上面的语句是等价的)

    这样情况的原因是因为数据库不会去分析变量中的, 号,并将变量拆分开来重新组合成新的SQL语句。

 

目录:

1.0       Table 变量和临时表,数据库中的表的区别和相同点

2.0       解决上面问题的两种途径

2.1 使用 Exec(SQL命令字符串)的方式 动态的返回数据

2.2 使用Table数据类型方式解决

  

1.0   Table 变量和临时表,数据库中的表的区别和相同点

 Table变量的概念

         Table变量是一种特殊的数据类型,在SQL程序中可以将多维的信息零时的保存到Table变量中,供后  续处理,该数据类型保存数据的形式为一组行,这些行将可作为表值函数的结果集返回。

Table 变量不能作为 存储过程,和自定义函数的变量

 

临时表

   由会话创建于tempdb 数据库的 sysobjects 表中的临时表 ,

 

 Table和临时表,数据库中表的区别:

SQL语句的支持

Table 变量

对于表的列的约束类型仅仅为PRIMARY KEYUNIQUE KEYNULL

INSERT INTO table_variable EXEC 存储过程。

支持基本的SELECTINSERTUPDATEDELETE基本的表操作语句

 

临时表和数据库中实际的表 对表的语句的支持是一致(全部支持)。


实际的存储位置和生存的时间

Table 对象 和其他的类型的变量生成的周期是一样的,有明确的作用域,在超过作用域时系统自动的删除Table对象。

Table 对象实际上和其他类型的变量一样保存在内存中

 

临时表和数据库中的表都存储在实际的数据库中

临时表 #TableName的作用域是当前的会话中
              ##TableName 的作用域为全局量
 
 
2.0解决上面问题的两种途径
          2.1 使用 Exec(SQL命令字符串)的方式 动态的返回数据
 
 
 
  

Declare @Command  Varchar(1000 
  )   
Declare  @ParamIDList Varchar(500 
  )
Set @ ParamIDList= 
  ’张三,李四,王五’
Set   @Command  =’Select 姓名,性别,年龄 From  Persons where Name In(’+@ ParamIDList+ 
  ’)’
Exec(@Command 
  )
 
 

         2.2 使用Table数据类型方式解决
 
 
  
  
/**/ 
  /* 根据输入的@ParamIDList列表来生Name列表*/ 
  
  
  Declare 
     
  @ParamIDList 
    
  Varchar 
  ( 
  500 
  )
 D 
  eclare 
    
  @Table_NameList 
    
  table 
   ( Name  
  Varchar 
  ( 
  20 
  ))   
  -- 
   建立表变量 
  
 
      Declare 
    
  @Index_Param 
    
  int 
      
  /**/ 
  /*参数 记录分隔符的位置*/
     
  Declare 
    
  @NeedParse 
    
  varchar 
  ( 
  500 
  )  
  /**/ 
  /*参数 没有处理的字符串*/ 
  

   
  Select 
     
  @Index_Param 
  = 
  CharIndex 
  ( 
  ' 
  , 
  ' 
  ,  
  @ParamIDList 
  )
   
  if 
   ( 
  @Index_Param 
  = 
  0 
  )
 
  begin 
           
  /**/ 
  /*一个名字组成*/ 
  
           
  insert 
    
  into 
    
  @Table_NameList 
   (Name)  
  values 
  ( 
  @ParamIDList 
  )
   
  end 
  
 
  else 
        
  /**/ 
  /*存在多个名字*/ 
  
         
  begin 
  
              
  set 
    
  @NeedParse 
    
  = 
  @ParamIDList 
  
              
  while 
   ( 
  CharIndex 
  ( 
  ' 
  , 
  ' 
  ,  
  @NeedParse 
  ) 
  > 
  0 
  )
                  
  begin 
  
                           
  insert 
    
  into 
    
  @Table_NameList  
  (Name)  
  values 
  ( 
  SubString 
  ( 
  @BeginString 
  , 
  1 
  , 
  CharIndex 
  ( 
  ' 
  , 
  ' 
  , 
  @BeginString 
  ) 
  - 
  1 
  ))
                         
  set 
    
  @NeedParse 
    
  = 
  SubString 
  ( 
  @NeedParse 
  , 
  CharIndex 
  ( 
  ' 
  , 
  ' 
  ,  
  @NeedParse 
  ) 
  + 
  1 
  , 
  len 
  ( 
  @NeedParse 
  ) 
  - 
  CharIndex 
  ( 
  ' 
  , 
  ' 
  ,  
  @NeedParse 
  ))
             
  end 
  
         
  insert 
    
  into 
    
  @Table_NameList 
   (Name)  
  values 
  ( 
  @NeedParse 
  )
     
  end 
  


 
  Select 
   姓名,性别,年龄  
  From 
    Persons  
  where 
   Name  
  In 
  ( 
  select 
   Name  
  from 
    
  @Table_NameList 
  )