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

怪我咯
發布: 2017-07-05 11:06:00
原創
1898 人瀏覽過

這篇文章主要向大家講述的是非動態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語句執行動態查詢的描述,希望會為你帶來一些幫助在此方面。

以上是以非動態SQL Server SQL語句來對動態查詢進行執行詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!