一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 用非動態SQL Server SQL語句來對動態查詢進行執行

用非動態SQL Server SQL語句來對動態查詢進行執行

2020-05-20 15:42MSSQL教程網 Sql Server

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

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

是否存在一種不執行動態SQL語句也能完成查詢的方式呢?

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

專家解答:

這里存在一種不執行動態SQL ServerSQL語句也能完成查詢的方式,但是首先讓我們來探究這個問題。我將在以下例子中運用AdventureWorks數據庫。

在你只有一個值的時候,執行將不會有什么問題。

?
1
2
3
4
Declare @ManagerIDs Varchar(100)
Set @ManagerIDs = '3'
Select * from HumanResources.Employee
Where ManagerID IN (@ManagerIDs)

但是一旦你增加逗號,結果就會大致如下:

?
1
2
3
4
5
6
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列是一個整數,因此會自動把@ManagerIDs轉換成變量。

為了解決這個問題,你可以運用動態SQL執行這個語句。這樣,你就能在執行它之前動態地建立整個查詢。

?
1
2
3
4
5
6
7
Declare @ManagerIDs Varchar(100)
Set @ManagerIDs = '3,6'
Declare @SQL Varchar(1000)
Set @SQL =
'Select * from HumanResources.Employee
Where ManagerID IN (' + @ManagerIDs + ')'
EXEC (@SQL)

這樣能讓你執行這個查詢,但是動態SQL是個危險分子,在一些特定的組織中甚至不被允許使用。

那么你要如何在不使用動態SQL的情況下執行查詢呢?可以通過XML實現。

第一步,你需要從一個以逗劃定界限的字符串中產生一個XML字段。

?
1
2
3
4
5
6
7
8
9
10
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值,結果顯示如下:

?
1
Select @XmlStr

既然你有一個XML字段,我們就可以查詢它,結果按行顯示如下:

?
1
2
SELECT x.ManagerID.value('.', 'INT') AS A
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)

現在,你可以利用之前的查詢來限制結果:

?
1
2
3
4
5
6
SELECT *
FROM HumanResources.Employee
WHERE ManagerID IN(
SELECT x.ManagerID.value('.', 'INT') AS A
FROM @XmlStr.nodes('//ManagerID') x(ManagerID)
)

或者,你可以利用Inner Join來限制結果:

?
1
2
3
4
5
6
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

上述的相關內容就是對非動態SQL ServerSQL語句執行動態查詢的描述,希望會給你帶來一些幫助在此方面。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲免费视频一区二区三区 | 国产久热精品 | 精品国产mmd在线观看 | 成人在线日韩 | 欧美亚洲综合另类 | 日本mature乱子视频 | 亚洲人成毛片线播放 | 俄罗斯美女大逼 | 996热精品视频在线观看 | 欧美一区二区三区久久久 | 精品高潮呻吟99AV无码 | 亚洲色图二区 | 国产自产自拍 | 日本大尺度激情做爰叫床 | 9l国产精品久久久久麻豆 | 国产精品成 | 1717she精品视频在线观看 | 歪歪私人影院成人毛片 | 国产视频三区 | 国产午夜精品久久久久小说 | 久草在线福利资站免费视频 | 91精品国产综合久 | ai换脸明星造梦工厂忘忧草 | 好男人影视社区www在线观看 | 精品国产免费第一区二区 | 亚洲欧美在线观看首页 | 天堂欧美 | 国产精品久久久久aaaa | 黑人巨摘花第一次出血 | 午夜性色一区二区三区不卡视频 | 久久久免费热线精品频 | 色色色色网站 | 色综合中文字幕天天在线 | 男人香蕉好大好爽视频 | 手机看片自拍自自拍日韩免费 | 亚洲国产婷婷俺也色综合 | 狠狠综合视频精品播放 | 欧美精品久久一区二区三区 | 国产亚洲精品美女2020久久 | 国产欧美一区二区三区精品 | 免费看全黄特黄毛片 |