轉載於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)