在SQL語句中如何將字符串變量傳遞給In語句

 轉載於http://www.cnblogs.com/macroxu-1982/archive/2007/03/05/664500.html

 

本文適用的環境

數據庫管理系統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 使用 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)


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章