用非動(dòng)態(tài)SQL Server SQL語句來對(duì)動(dòng)態(tài)查詢進(jìn)行執(zhí)行
此文章主要向大家講述的是非動(dòng)態(tài)SQL ServerSQL語句執(zhí)行動(dòng)態(tài)查詢,在實(shí)際操作中我嘗試在一個(gè)存儲(chǔ)過程中,來進(jìn)行傳遞一系列以逗號(hào)劃定界限的值,來對(duì)結(jié)果集進(jìn)行限制。但是無論什么時(shí)候,我在IN子句中使用變量,都會(huì)得到錯(cuò)誤信息。
是否存在一種不執(zhí)行動(dòng)態(tài)SQL語句也能完成查詢的方式呢?
我嘗試在一個(gè)存儲(chǔ)過程中傳遞一系列以逗號(hào)劃定界限的值,以限制結(jié)果集。但是無論什么時(shí)候,我在IN子句中使用變量,都會(huì)得到錯(cuò)誤信息。是否存在一種不執(zhí)行動(dòng)態(tài)SQL ServerSQL語句也能完成查詢的方式呢?
專家解答:
這里存在一種不執(zhí)行動(dòng)態(tài)SQL ServerSQL語句也能完成查詢的方式,但是首先讓我們來探究這個(gè)問題。我將在以下例子中運(yùn)用AdventureWorks數(shù)據(jù)庫。
在你只有一個(gè)值的時(shí)候,執(zhí)行將不會(huì)有什么問題。
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è)問題,你可以運(yùn)用動(dòng)態(tài)SQL執(zhí)行這個(gè)語句。這樣,你就能在執(zhí)行它之前動(dòng)態(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è)查詢,但是動(dòng)態(tài)SQL是個(gè)危險(xiǎn)分子,在一些特定的組織中甚至不被允許使用。
那么你要如何在不使用動(dòng)態(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)容就是對(duì)非動(dòng)態(tài)SQL ServerSQL語句執(zhí)行動(dòng)態(tài)查詢的描述,希望會(huì)給你帶來一些幫助在此方面。
- SQL SERVER 中構(gòu)建執(zhí)行動(dòng)態(tài)SQL語句的方法
- 分享一下SQL Server執(zhí)行動(dòng)態(tài)SQL的正確方式
- sql server動(dòng)態(tài)存儲(chǔ)過程按日期保存數(shù)據(jù)示例
- sqlserver 動(dòng)態(tài)創(chuàng)建臨時(shí)表的語句分享
- asp.net Menu控件+SQLServer實(shí)現(xiàn)動(dòng)態(tài)多級(jí)菜單
- sqlserver 存儲(chǔ)過程動(dòng)態(tài)參數(shù)調(diào)用實(shí)現(xiàn)代碼
- sqlserver 支持定位當(dāng)前頁,自定義排序的分頁SQL(拒絕動(dòng)態(tài)SQL)
- SQL Server中執(zhí)行動(dòng)態(tài)SQL
相關(guān)文章
獲取數(shù)據(jù)庫中兩個(gè)時(shí)間字段的相差天數(shù)及ABS/DATEDIFF函數(shù)應(yīng)用
本文將詳細(xì)介紹獲取數(shù)據(jù)庫中兩個(gè)時(shí)間字段的相差天數(shù)及ABS/DATEDIFF函數(shù)應(yīng)用感興趣的朋友可以了解下哦,希望本文對(duì)你鞏固ABS/DATEDIFF函數(shù)有所幫助2013-01-01Sql學(xué)習(xí)第一天——SQL 練習(xí)題(建表/sql語句)
來自Madrid且訂單數(shù)少于3的消費(fèi)者,針對(duì)這個(gè)要求作出以下:建表 做題分析以及sql語句的寫法,感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03格式導(dǎo)致的Excel導(dǎo)入sql出現(xiàn)異常的解決方法
因?yàn)镋xcel導(dǎo)入到sql的事兒,今天折騰了大半天。2009-03-03用SQL統(tǒng)計(jì)SQLServe表存儲(chǔ)空間大小的代碼
當(dāng)SQLServer數(shù)據(jù)庫越來越龐大,而其中的表有非常多的時(shí)候,想要知道到底是哪些表最耗存儲(chǔ)空間,到底該怎樣統(tǒng)計(jì)各個(gè)表的存儲(chǔ)大小呢2012-05-05SQL 雙親節(jié)點(diǎn)查找所有子節(jié)點(diǎn)的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猄QL 雙親節(jié)點(diǎn)查找所有子節(jié)點(diǎn)的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05淺析SQL Server中的執(zhí)行計(jì)劃緩存(上)
這篇文章主要介紹了淺析SQL Server中的執(zhí)行計(jì)劃緩存(上)的相關(guān)資料,需要的朋友可以參考下2015-12-12sql不常用函數(shù)總結(jié)以及事務(wù),增加,刪除觸發(fā)器
sql不常用函數(shù)總結(jié)以及事務(wù),增加,刪除觸發(fā)器,需要的朋友可以參考下2012-06-06