麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數(shù)據(jù)庫 > SQL Server > 正文

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

2024-08-31 01:04:57
字體:
供稿:網(wǎng)友

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

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

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

專家解答:

這里存在一種不執(zhí)行動態(tài)SQL ServerSQL語句也能完成查詢的方式,但是首先讓我們來探究這個問題。我將在以下例子中運(yùn)用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. 

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

為了解決這個問題,你可以運(yù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實(shí)現(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 

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


注:相關(guān)教程知識閱讀請移步到MSSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产免费看| 亚洲影院在线播放 | 精品一区二区在线观看视频 | 91精品观看91久久久久久国产 | 91九色免费视频 | 一级视频网站 | 国产精选久久久 | 黄色av免费 | 久久九九热re6这里有精品 | 亚洲导航深夜福利涩涩屋 | 操操插插 | 精品国产一区二区三区四区在线 | 成年免费视频黄网站在线观看 | 欧美性激情视频 | 五月天影院,久久综合, | 沉沦的校花奴性郑依婷c到失禁 | 国产91久久精品 | 精品一区二区三区免费 | 激情视频免费看 | 黄色男女视频 | 欧美成人亚洲 | 欧美日韩亚洲国产 | 97久久精品一区二区三区观看 | 国产精品久久久久久影院8一贰佰 | 成年性羞羞视频免费观看 | 日韩电影一区二区三区 | 亚洲日本欧美 | 一区二区免费看 | 久久久久久亚洲国产精品 | 91久久夜色精品国产网站 | 一区二区三视频 | 久久精品国产亚洲7777 | 日本精品婷婷久久爽一下 | 欧美性生活区 | 亚洲国产精品久久久久婷婷老年 | 成人在线视频免费观看 | 视频一区二区三区在线播放 | 日本欧美一区二区三区在线播 | 国产电影精品久久 | 成人午夜高清 | 91久久久久久 |