您的位置:首页 > 数据库

sql 存储过程 where条件 in 字符串参数

2011-11-09 16:45 471 查看
一、使用 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 where Name =@ ParamIDList
(和上面的语句是等价的)
这样情况的原因是因为数据库不会去分析变量中的,
号,并将变量拆分开来重新组合成新的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 KEY
NULL
INSERT INTO table_variable
EXEC 存储过程。
支持基本的SELECTINSERTUPDATE
DELETE基本的表操作语句

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

实际的存储位置和生存的时间
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)


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: