用非動態(tài)SQL Server SQL語句來對動態(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í)行將不會有什么問題。
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3' Select * from HumanResources.Employee Where ManagerID IN (@ManagerIDs)
但是一旦你增加逗號,結(jié)果就會大致如下:
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列是一個整數(shù),因此會自動把@ManagerIDs轉(zhuǎn)換成變量。
為了解決這個問題,你可以運用動態(tài)SQL執(zhí)行這個語句。這樣,你就能在執(zhí)行它之前動態(tài)地建立整個查詢。
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3,6' Declare @SQL Varchar(1000) Set @SQL = 'Select * from HumanResources.Employee Where ManagerID IN (' + @ManagerIDs + ')' EXEC (@SQL)
這樣能讓你執(zhí)行這個查詢,但是動態(tài)SQL是個危險分子,在一些特定的組織中甚至不被允許使用。
那么你要如何在不使用動態(tài)SQL的情況下執(zhí)行查詢呢?可以通過XML實現(xiàn)。
第一步,你需要從一個以逗劃定界限的字符串中產(chǎn)生一個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值,結(jié)果顯示如下:
Select @XmlStr
既然你有一個XML字段,我們就可以查詢它,結(jié)果按行顯示如下:
SELECT x.ManagerID.value('.', 'INT') AS A FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
現(xiàn)在,你可以利用之前的查詢來限制結(jié)果:
SELECT * FROM HumanResources.Employee WHERE ManagerID IN( SELECT x.ManagerID.value('.', 'INT') AS A FROM @XmlStr.nodes('//ManagerID') x(ManagerID) )
或者,你可以利用Inner Join來限制結(jié)果:
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
上述的相關內(nèi)容就是對非動態(tài)SQL ServerSQL語句執(zhí)行動態(tài)查詢的描述,希望會給你帶來一些幫助在此方面。
版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。