用非動(dòng)態(tài)SQL Server SQL語(yǔ)句來(lái)對(duì)動(dòng)態(tài)查詢(xún)進(jìn)行執(zhí)行
此文章主要向大家講述的是非動(dòng)態(tài)SQL ServerSQL語(yǔ)句執(zhí)行動(dòng)態(tài)查詢(xún),在實(shí)際操作中我嘗試在一個(gè)存儲(chǔ)過(guò)程中,來(lái)進(jìn)行傳遞一系列以逗號(hào)劃定界限的值,來(lái)對(duì)結(jié)果集進(jìn)行限制。但是無(wú)論什么時(shí)候,我在IN子句中使用變量,都會(huì)得到錯(cuò)誤信息。
是否存在一種不執(zhí)行動(dòng)態(tài)SQL語(yǔ)句也能完成查詢(xún)的方式呢?
我嘗試在一個(gè)存儲(chǔ)過(guò)程中傳遞一系列以逗號(hào)劃定界限的值,以限制結(jié)果集。但是無(wú)論什么時(shí)候,我在IN子句中使用變量,都會(huì)得到錯(cuò)誤信息。是否存在一種不執(zhí)行動(dòng)態(tài)SQL ServerSQL語(yǔ)句也能完成查詢(xún)的方式呢?
專(zhuān)家解答:
這里存在一種不執(zhí)行動(dòng)態(tài)SQL ServerSQL語(yǔ)句也能完成查詢(xún)的方式,但是首先讓我們來(lái)探究這個(gè)問(wèn)題。我將在以下例子中運(yùn)用AdventureWorks數(shù)據(jù)庫(kù)。
在你只有一個(gè)值的時(shí)候,執(zhí)行將不會(huì)有什么問(wèn)題。
Declare @ManagerIDs Varchar(100) Set @ManagerIDs = '3' Select * from HumanResources.Employee Where ManagerID IN (@ManagerIDs)
但是一旦你增加逗號(hào),結(jié)果就會(huì)大致如下:
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.
這是因?yàn)镾QL Sever分辨出ManagerID列是一個(gè)整數(shù),因此會(huì)自動(dòng)把@ManagerIDs轉(zhuǎn)換成變量。
為了解決這個(gè)問(wèn)題,你可以運(yùn)用動(dòng)態(tài)SQL執(zhí)行這個(gè)語(yǔ)句。這樣,你就能在執(zhí)行它之前動(dòng)態(tài)地建立整個(gè)查詢(xún)。
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í)行這個(gè)查詢(xún),但是動(dòng)態(tài)SQL是個(gè)危險(xiǎn)分子,在一些特定的組織中甚至不被允許使用。
那么你要如何在不使用動(dòng)態(tài)SQL的情況下執(zhí)行查詢(xún)呢?可以通過(guò)XML實(shí)現(xiàn)。
第一步,你需要從一個(gè)以逗劃定界限的字符串中產(chǎn)生一個(gè)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 ''
接著,選擇這個(gè)XML值,結(jié)果顯示如下:
Select @XmlStr
既然你有一個(gè)XML字段,我們就可以查詢(xún)它,結(jié)果按行顯示如下:
SELECT x.ManagerID.value('.', 'INT') AS A
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
現(xiàn)在,你可以利用之前的查詢(xún)來(lái)限制結(jié)果:
SELECT *
FROM HumanResources.Employee
WHERE ManagerID IN(
SELECT x.ManagerID.value('.', 'INT') AS A
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
)
或者,你可以利用Inner Join來(lái)限制結(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
上述的相關(guān)內(nèi)容就是對(duì)非動(dòng)態(tài)SQL ServerSQL語(yǔ)句執(zhí)行動(dòng)態(tài)查詢(xún)的描述,希望會(huì)給你帶來(lái)一些幫助在此方面。
- SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
- 分享一下SQL Server執(zhí)行動(dòng)態(tài)SQL的正確方式
- sql server動(dòng)態(tài)存儲(chǔ)過(guò)程按日期保存數(shù)據(jù)示例
- sqlserver 動(dòng)態(tài)創(chuàng)建臨時(shí)表的語(yǔ)句分享
- asp.net Menu控件+SQLServer實(shí)現(xiàn)動(dòng)態(tài)多級(jí)菜單
- sqlserver 存儲(chǔ)過(guò)程動(dòng)態(tài)參數(shù)調(diào)用實(shí)現(xiàn)代碼
- sqlserver 支持定位當(dāng)前頁(yè),自定義排序的分頁(yè)SQL(拒絕動(dòng)態(tài)SQL)
- SQL Server中執(zhí)行動(dòng)態(tài)SQL
相關(guān)文章
sqlserver中去除字符串中連續(xù)的分隔符的sql語(yǔ)句
sqlserver中去除字符串中連續(xù)的分隔符的sql語(yǔ)句,需要的朋友可以參考下2012-05-05
SQL server高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn)
這篇文章主要介紹了SQL server高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
SQLServer 批量插入數(shù)據(jù)的兩種方法
在SQL Server 中插入一條數(shù)據(jù)使用Insert語(yǔ)句,但是如果想要批量插入一堆數(shù)據(jù)的話,循環(huán)使用Insert不僅效率低,而且會(huì)導(dǎo)致SQL一系統(tǒng)性能問(wèn)題。下面介紹SQL Server支持的兩種批量數(shù)據(jù)插入方法:Bulk和表值參數(shù)(Table-Valued Parameters)。2009-07-07
MDF文件在SQL Server中的恢復(fù)技術(shù)
MDF文件在SQL Server中的恢復(fù)技術(shù)...2007-01-01
SQL數(shù)據(jù)庫(kù)實(shí)例名稱(chēng)找不到或遠(yuǎn)程連接失敗并顯示錯(cuò)誤error40的原因及解決辦法
這篇文章主要介紹了SQL數(shù)據(jù)庫(kù)實(shí)例名稱(chēng)找不到或遠(yuǎn)程連接失敗并顯示錯(cuò)誤error40的原因及解決辦法,需要的朋友可以參考下2015-11-11
設(shè)置SQLServer數(shù)據(jù)庫(kù)中某些表為只讀的多種方法分享
在某些情況下需要把SQLServer的表設(shè)為只讀,下面舉出幾種方法,需要的朋友可以參考下2012-06-06

