热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

在SQL语句中如何将字符串变量传递给In语句

本文适用的环境数据库管理系统SQLSever2000前言在编写SQL程序是我们有可能遇到这样的问题,参数是动态数量的标识列表(比如我们要处理一批有限的人员的信息,我们传递

本文适用的环境

数据库管理系统SQL Sever2000

 

  前言

   在编写SQL程序是我们有可能遇到这样的问题,参数是动态数量的标识列表(比如我们要处理一批有限的人员的信息,我们传递的参数就可以这样表示 人员的标识一(主键),人员表识二,人员标识三。。。。。。),在这个参数中标识数量是动态的可能是五个,也可能是六个。

   在需要根据这个标识列表去查询人员并返回人员的信息时 ,我们可能很自然的想到这样的写法

     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 使用 ExecSQL命令字符串)的方式 动态的返回数据

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




推荐阅读
  • 删除数据如果你失忆了,希望你能想起曾经为了追求梦想的你。同学们,我们先来一波推理吧,理论:你给机器下达命令:给本大爷删除这个表里的“某个”数据,你想的是,删除某个 ... [详细]
  • 硬盘和内存的区别是什么?它们各有什么性能指标?
    常见问题硬盘,内存,性能指标常见问题小说导航站源码,vscode调整代码格式,ubuntu终端命名,打开和关闭tomcat,sqlite2下载安装,python爬虫解析反爬虫,ht ... [详细]
  • 数据库技术:mysql 子查询与连接表详情
    目录1、什么是子查询?列出订购物品tnt2的所有客户:selectcust_idfromorderswhereorder_numin(selectorder_numf ... [详细]
  • 后端开发|php教程public,function,protected,mdash,Jordan后端开发-php教程周五了啦啦啦啦-LAMP+PHP‘sOOP部门信息管理系统asp ... [详细]
  • 6个常见的 PHP 安全性攻击实例和阻止方法_php实例
    这篇文章主要介绍了6个常见的PHP安全性攻击实例和阻止方法,有对这方面感兴趣的小伙伴 ... [详细]
  • 通过CreateDirectory命令创建相应的Directory之后,可以将目录的访问权限授予其他用户,这样其他用户就能通过外部表访问很多主机上的文件,而不需要登录到数据库服务器 ... [详细]
  • MyBatis模糊查询和多条件查询一、ISmbmsUserDao层根据姓名模糊查询publicListgetUser();多条件查询publicList ... [详细]
  • delphi控件大全
    本文章已收录于:delphi控件查询:http:www.torry.nethttp:www.jrsoftware.orgTb97最有名的工具条(ToolBar) ... [详细]
  • 目录读写文本格式序列化使用数据库合并数据集重塑和轴向旋转数据转换读写文本格式CSV(Comma-SeparatedValues)格式的文件是指以纯文本形式存储的表格数据,这意味着不 ... [详细]
  • 怪事天天有 今年特别多今天插入数据时,突然报了一个ORA-02290:违反检查约束条件没错,是他是他就是他,我就开始寻思我并没有违反主键约束,sql更没有写错到底是为撒内,在检查一 ... [详细]
  • BEGIN#声明一个开关变量flag用于循环结束判断DECLAREflagBOOLDEFAULTFALSE;#声明变量1DECLAREBL1VARCHAR(255);#声明变量2D ... [详细]
  • 【自制小工具】代码生成器
    【自制小工具】代码生成器陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧。界面非常简单,反正是自己用的,简单点用起来也方便上图:左 ... [详细]
  • lazarus使用sqlite3遇到特定字符时出现乱码的Bug
    lazarus使用zeosDB控件时发现SQLite一个奇怪的现象,应用程序编译为win64时,如果输入中国2022中国时出现乱码,win32和linux64正常,开始怀疑的sql ... [详细]
  • 本文目录一览:1、数据库有哪几种2、数据库软件 ... [详细]
  • 例子如Table表有性别字段,1代表男2代表女、3代表中性、还有没填就代表未说明selectid,decode(sex,'1','男', ... [详细]
author-avatar
亘古轻柔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有