存储过程中动态条件的添加 where条件 in条件中字符串参数
2012-09-25 16:48
591 查看
http://topic.csdn.net/u/20070531/11/2777896d-27c0-4ddc-9c9c-5983dfff5a30.html?110579472 http://www.cnblogs.com/macroxu-1982/archive/2007/03/05/664500.html 一、使用 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 @ParamIDListVarchar(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 KEY、UNIQUE KEY 和 NULL
INSERT INTO table_variable EXEC 存储过程。
支持基本的SELECT、INSERT、UPDATE 和 DELETE基本的表操作语句
临时表和数据库中实际的表 对表的语句的支持是一致(全部支持)。
实际的存储位置和生存的时间
Table 对象 和其他的类型的变量生成的周期是一样的,有明确的作用域,在超过作用域时系统自动的删除Table对象。
Table 对象实际上和其他类型的变量一样保存在内存中
临时表和数据库中的表都存储在实际的数据库中
临时表 #TableName的作用域是当前的会话中
##TableName 的作用域为全局量
2.0解决上面问题的两种途径
2.1 使用 Exec(SQL命令字符串)的方式 动态的返回数据
Declare@Command Varchar(1000) Declare @ParamIDListVarchar(500) Set @ ParamIDList=’张三,李四,王五’ Set @Command =’Select 姓名,性别,年龄 From Persons where Name In(’+@ ParamIDList+’)’ Exec(@Command)
2.2 使用Table数据类型方式解决
Declare @ParamIDListVarchar(500) Declare@Table_NameListtable ( Name Varchar(20)) -- 建立表变量 Declare@Index_Paramint /**//*参数 记录分隔符的位置*/ Declare@NeedParsevarchar(500) /**//*参数 没有处理的字符串*/ Select @Index_Param=CharIndex(',', @ParamIDList) if (@Index_Param=0) insertinto@Table_NameList (Name) values(@ParamIDList) end begin set@NeedParse=@ParamIDList while (CharIndex(',', @NeedParse)>0) begin insertinto@Table_NameList(Name) values(SubString(@BeginString,1,CharIndex(',',@BeginString)-1)) set@NeedParse=SubString(@NeedParse,CharIndex(',', @NeedParse)+1,len(@NeedParse)-CharIndex(',', @NeedParse)) end insertinto@Table_NameList (Name) values(@NeedParse) end Select 姓名,性别,年龄 From Persons where Name In(select Name from@Table_NameList)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Declare @ParamIDListVarchar(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 KEY、UNIQUE KEY 和 NULL
INSERT INTO table_variable EXEC 存储过程。
支持基本的SELECT、INSERT、UPDATE 和 DELETE基本的表操作语句
临时表和数据库中实际的表 对表的语句的支持是一致(全部支持)。
实际的存储位置和生存的时间
Table 对象 和其他的类型的变量生成的周期是一样的,有明确的作用域,在超过作用域时系统自动的删除Table对象。
Table 对象实际上和其他类型的变量一样保存在内存中
临时表和数据库中的表都存储在实际的数据库中
临时表 #TableName的作用域是当前的会话中
##TableName 的作用域为全局量
2.0解决上面问题的两种途径
2.1 使用 Exec(SQL命令字符串)的方式 动态的返回数据
Declare@Command Varchar(1000) Declare @ParamIDListVarchar(500) Set @ ParamIDList=’张三,李四,王五’ Set @Command =’Select 姓名,性别,年龄 From Persons where Name In(’+@ ParamIDList+’)’ Exec(@Command)
2.2 使用Table数据类型方式解决
Declare @ParamIDListVarchar(500) Declare@Table_NameListtable ( Name Varchar(20)) -- 建立表变量 Declare@Index_Paramint /**//*参数 记录分隔符的位置*/ Declare@NeedParsevarchar(500) /**//*参数 没有处理的字符串*/ Select @Index_Param=CharIndex(',', @ParamIDList) if (@Index_Param=0) insertinto@Table_NameList (Name) values(@ParamIDList) end begin set@NeedParse=@ParamIDList while (CharIndex(',', @NeedParse)>0) begin insertinto@Table_NameList(Name) values(SubString(@BeginString,1,CharIndex(',',@BeginString)-1)) set@NeedParse=SubString(@NeedParse,CharIndex(',', @NeedParse)+1,len(@NeedParse)-CharIndex(',', @NeedParse)) end insertinto@Table_NameList (Name) values(@NeedParse) end Select 姓名,性别,年龄 From Persons where Name In(select Name from@Table_NameList)
相关文章推荐
- 存储过程中动态条件的添加 where条件 in条件中字符串参数
- sql 存储过程 where条件 in 字符串参数
- MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
- 动态SQL文中where条件是IN,而导入的参数个数不确定的情况(亲自实践)
- Sql Server 存储过程 动态添加WHERE条件 (转载)
- [置顶] mybatis根据参数动态拼接多个where条件
- Sql 存储过程动态添加where条件
- Mybatis 不确定条件查询(动态语句where和if)借助实体类封装参数
- 泛型约束where条件的使用(通过类型参数动态反射创建实例)
- 泛型约束where条件的使用(可以通过类型参数动态反射创建实例)
- sql 解析字符串添加到临时表中 sql存储过程in 参数输入
- 编写一个过程将查询的字段和where条件中的字符串值动态调用
- 解决mysql查询,in条件参数为带逗号的字符串,查询结果错误
- 使用ADF-BC 实现查询功能之四:通过代码动态设置Where条件参数
- 关于JAVA调用ORACLE存储过程时,传入动态参数作为in语句条件的问题
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- 关于JAVA调用ORACLE存储过程时,传入动态参数作为in语句条件的问题
- Thinking in java 为前一个练习中的类添加一个重载的构造器,令其接受一个字符串作为参数,并在构造器中把你自己的消息和接收到的参数打印出来
- Mysql where in中的参数传入字符串(字符串拼接)
- JDBC PreparedStatement 预编译语句 动态添加条件-SQL参数不定