雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

MsSql

當(dāng)前位置:主頁 > 數(shù)據(jù)庫 > MsSql >

用非動態(tài)SQL Server SQL語句來對動態(tài)查詢進(jìn)行執(zhí)行

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:MsSql|點(diǎn)擊:

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

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

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

專家解答:

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

在你只有一個(gè)值的時(shí)候,執(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. 

這是因?yàn)镾QL Sever分辨出ManagerID列是一個(gè)整數(shù),因此會自動把@ManagerIDs轉(zhuǎn)換成變量。

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

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è)查詢,但是動態(tài)SQL是個(gè)危險(xiǎn)分子,在一些特定的組織中甚至不被允許使用。

那么你要如何在不使用動態(tài)SQL的情況下執(zhí)行查詢呢?可以通過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字段,我們就可以查詢它,結(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 

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

上一篇:SQL Server 性能調(diào)優(yōu)之查詢從20秒至2秒的處理方法

欄    目:MsSql

下一篇:SqlServer索引的原理與應(yīng)用詳解

本文標(biāo)題:用非動態(tài)SQL Server SQL語句來對動態(tài)查詢進(jìn)行執(zhí)行

本文地址:http://www.jygsgssxh.com/a1/MsSql/10459.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有