日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
用非動態(tài)SQLServerSQL語句來對動態(tài)查詢進行執(zhí)行

此文章主要向大家講述的是非動態(tài)SQL ServerSQL語句執(zhí)行動態(tài)查詢,在實際操作中我嘗試在一個存儲過程中,來進行傳遞一系列以逗號劃定界限的值,來對結(jié)果集進行限制。但是無論什么時候,我在IN子句中使用變量,都會得到錯誤信息。

是否存在一種不執(zhí)行動態(tài)SQL語句也能完成查詢的方式呢?

我嘗試在一個存儲過程中傳遞一系列以逗號劃定界限的值,以限制結(jié)果集。但是無論什么時候,我在IN子句中使用變量,都會得到錯誤信息。是否存在一種不執(zhí)行動態(tài)SQL ServerSQL語句也能完成查詢的方式呢?

專家解答:

這里存在一種不執(zhí)行動態(tài)SQL ServerSQL語句也能完成查詢的方式,但是首先讓我們來探究這個問題。我將在以下例子中運用AdventureWorks數(shù)據(jù)庫。

在你只有一個值的時候,執(zhí)行將不會有什么問題。

 
 
 
  1. Declare @ManagerIDs Varchar(100)   
  2. Set @ManagerIDs = '3'   
  3. Select * from HumanResources.Employee   
  4. Where ManagerID IN (@ManagerIDs)  

但是一旦你增加逗號,結(jié)果就會大致如下:

 
 
 
  1. Declare @ManagerIDs Varchar(100)   
  2. Set @ManagerIDs = '3,6'   
  3. Select * from HumanResources.Employee   
  4. Where ManagerID IN (@ManagerIDs)   
  5. Msg 245, Level 16, State 1, Line 4   
  6. Conversion failed when converting the varchar value '3,6' to data type int.  

這是因為SQL Sever分辨出ManagerID列是一個整數(shù),因此會自動把@ManagerIDs轉(zhuǎn)換成變量。

為了解決這個問題,你可以運用動態(tài)SQL執(zhí)行這個語句。這樣,你就能在執(zhí)行它之前動態(tài)地建立整個查詢。

 
 
 
  1. Declare @ManagerIDs Varchar(100)   
  2. Set @ManagerIDs = '3,6'   
  3. Declare @SQL Varchar(1000)   
  4. Set @SQL =   
  5. 'Select * from HumanResources.Employee   
  6. Where ManagerID IN (' + @ManagerIDs + ')'   
  7. EXEC (@SQL)  

這樣能讓你執(zhí)行這個查詢,但是動態(tài)SQL是個危險分子,在一些特定的組織中甚至不被允許使用。

那么你要如何在不使用動態(tài)SQL的情況下執(zhí)行查詢呢?可以通過XML實現(xiàn)。

***步,你需要從一個以逗劃定界限的字符串中產(chǎn)生一個XML字段。

 
 
 
  1. Declare @ManagerIDs Varchar(100)   
  2. Set @ManagerIDs = '3,6'   
  3. DECLARE @XmlStr XML   
  4. SET @XmlStr =   
  5. --Start Tag   
  6. '' +   
  7. --Replace all commas with an ending tag and start a new tag   
  8. REPLACE( @ManagerIDs, ',', '') +   
  9. --End Tag   
  10. ''  

接著,選擇這個XML值,結(jié)果顯示如下:

 
 
 
  1. Select @XmlStr  

既然你有一個XML字段,我們就可以查詢它,結(jié)果按行顯示如下:

 
 
 
  1. SELECT x.ManagerID.value('.', 'INT') AS A   
  2. FROM @XmlStr.nodes('//ManagerID') x(ManagerID)  

現(xiàn)在,你可以利用之前的查詢來限制結(jié)果:

 
 
 
  1. SELECT *   
  2. FROM HumanResources.Employee   
  3. WHERE ManagerID IN(   
  4. SELECT x.ManagerID.value('.', 'INT') AS A   
  5. FROM @XmlStr.nodes('//ManagerID') x(ManagerID)   
  6. )  

或者,你可以利用Inner Join來限制結(jié)果:

 
 
 
  1. SELECT *   
  2. FROM HumanResources.Employee AS A   
  3. INNER JOIN   
  4. (SELECT x.ManagerID.value('.', 'INT') AS ManagerID   
  5. FROM @XmlStr.nodes('//ManagerID') x(ManagerID)) B   
  6. ON A.ManagerID = B.ManagerID  

上述的相關(guān)內(nèi)容就是對非動態(tài)SQL ServerSQL語句執(zhí)行動態(tài)查詢的描述,希望會給你帶來一些幫助在此方面。


當前名稱:用非動態(tài)SQLServerSQL語句來對動態(tài)查詢進行執(zhí)行
文章路徑:http://www.5511xx.com/article/cdpccdp.html