用非動態SQL Server SQL語句來對動態查詢進行執行詳解

此文章主要向大家講述的是非動態sql serversql語句執行動態查詢,在實際操作中我嘗試在一個存儲過程中,來進行傳遞一系列以逗號劃定界限的值,來對結果集進行限制。但是無論什么時候,我在in子句中使用存儲過程,都會得到存儲過程

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

是否存在一種不執行動態SQL語句也能完成查詢的方式呢?

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

專家解答:

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

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

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

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

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

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

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

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

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

那么你要如何在不使用動態SQL的情況下執行查詢呢?可以通過XML實現。

第一步,你需要從一個以逗劃定界限的存儲過程中產生一個XML字段。

Declare?@ManagerIDs?Varchar(100)?  Set?@ManagerIDs?=?'3,6'?  DECLARE?@XmlStr?XML?  SET?@XmlStr?=?  --Start?Tag?  ''?+?  --Replace?all?commas?with?an?ending?tag?and?start?a?new?tag?  REPLACE(?@ManagerIDs,?',',?'')?+?  --End?Tag?  ''

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

Select?@XmlStr

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

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

現在,你可以利用之前的查詢來限制結果:

SELECT?*?  FROM?HumanResources.Employee?  WHERE?ManagerID?IN(?  SELECT?x.ManagerID.value('.',?'INT')?AS?A?  FROM?@XmlStr.nodes('//ManagerID')?x(ManagerID)?  )

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

SELECT?*?  FROM?HumanResources.Employee?AS?A?  INNER?JOIN?  (SELECT?x.ManagerID.value('.',?'INT')?AS?ManagerID?  FROM?@XmlStr.nodes('//ManagerID')?x(ManagerID))?B?  ON?A.ManagerID?=?B.ManagerID

上述的相關內容就是對非動態SQL ServerSQL語句執行動態查詢的描述,希望會給你帶來一些幫助在此方面。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享