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 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 @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)
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 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 @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)
相关文章推荐
- 存储过程中动态条件的添加 where条件 in条件中字符串参数
- 关于sql条件语句where id in (@参数)执行报错问题(转换成数据类型 int 时失败)(
- 动态SQL文中where条件是IN,而导入的参数个数不确定的情况(亲自实践)
- MySQL 存储过程或者函数中传参数实现where id in(1,2,3,...)IN条件拼接
- 存储过程中动态条件的添加 where条件 in条件中字符串参数
- mysql/sqlserver where in 传参数的问题
- 解决存储过程中SQL字符串语句执行引入参数的问题
- mysql/sqlserver where in 传参数的问题
- mysql 按年度、季度、月度、周、日SQL统计查询,mysql 存储过程 中 in 和 FIND_IN_SET 传递多个参数的使用
- cognos8通过sql制作报表---where条件作为提示参数
- 解决mysql的in条件中参数是带引号的字符串的时候查询失效
- Mysql where in中的参数传入字符串(字符串拼接)
- 将带有、号的字符串,以逗号分割,然后拼接为SQL语句的WHERE条件
- sql 自定义函数 ,where后拼接条件跳转语句,实现可变参数查询
- Postgresql 存储过程--sql语句的where条件的拼接操作
- MyBatis中forEach实现in条件下的集合参数SQL语句
- SQL写存储过程时参数作为条件的技巧
- 用存储过程生成分页的where条件拼接SQL
- 前台传入多个参数(数组格式),拼接成字符串中间用逗号隔开,传入到sql中用in查询.
- Entity SQL Language 三 Where/Exists/In/Like/参数及外键查询