在Sql Server查詢語句中使用變量表示表名、列字段名等動態查詢方式
前言
今天看了《SQL Server數據庫應用技術》的書,遇到的點疑惑也解決了,順便分享一下。我本來也要想做一個JSP的動態網頁,也要用到這個數據庫的查詢語句的知識點,所以正好實用。(注:需要點SQL Server基礎知識)
(一)exec與sp_executesql的區別
EXEC和sp_executesql都是SQL Server提供的兩種動態查詢語句,各有各的優勢,但是比較實用的還是後者,它提供了輸入輸出的接口,而exec是沒有的,最重要的是可以重用執行。一般使用exec語句命令,要麼是執行一個存儲過程,要麼是執行一個動態的查詢過程。
(二)exec的使用
普通使用SQL語句查詢可以使用以下3種方式:
select * from TableName exec('select * from TableName') exec sp_executesql N'select * from TableName'
字段名做變量查詢
declare @course varchar set @course = '課程名' Exec('select '+ @course +' from 課程表')
執行結果截圖是:
需要注意的是:
(2-1)要聲明數據類型的長度,否則會報錯
(2-2)字符串銜接沒有使用空格
表名做變量查詢
declare @tableName varchar(50) set @tableName = '課程表' Exec('select * from '+@TableName)
注意事項跟上面一樣
批處理查詢(多個變量字符串)
declare @TableName varchar(50),@SqlString varchar(200),@CourseID int; SET @TableName = '課程表'; SET @CourseID =1; SET @SqlString = 'select * from '+quotename(@TableName) +'where ID = '+cast(@CourseID as varchar(10)) EXEC(@SqlString);
執行結果截圖:
需要注意的是:
(3-1)要將變量不是字符型的轉換成字符型,否則會報錯,使用cast()轉換
(3-2)exec()括號內不允許使用多個變量串聯的字符串,否則會報錯
建議使用多個字符串的變量之間串聯,如:
exec(@SqlString1+@SqlString2+@SqlString3)
exec()接口問題
簡單的說就是不支持動態查詢輸入參數和輸出參數,如:
declare @TableName varchar(50),@XXCourseID varchar(3); SET @TableName = '課程表'; SET @XXCourseID ='5'; exec('select * from '+quotename(@TableName) +'where 先修課ID = '+@XXCourseID)
(三)sp_executesql的使用
簡單的查詢
declare @TableName varchar(50),@SqlString nvarchar(200),@CourseID int; SET @TableName = '課程表'; SET @CourseID =1; SET @SqlString = 'select * from '+quotename(@TableName) +'where ID = '+cast(@CourseID as varchar(10)) EXEC sp_executesql @SqlString
需要注意的是:
(1-1)執行的查詢語句字符串爲三種類型:ntext、nchar、nvarchar,否則會報錯
使用接口(支持參數的輸入輸出)
@stmt = <statement>
,–類似存儲過程主體@params = <params>
, –類似存儲過程參數部分<params assignment>
–類似存儲過程調用@stmt
參數是輸入的動態批處理,它可以引入輸入參數或輸出參數,和存儲過程的主體語句一樣,只不過它是動態的,而存儲過程是靜態的,不過你也可以在存儲過程中使用sp_executesql;@params
參數與定義輸入/輸出參數的存儲過程頭類似,實際上和存儲過程頭的語法完全一樣;@<params assignment>
與調用存儲過程的EXEC部分類似。declare @TableName varchar(50),@SqlString nvarchar(200),@CourseID int; SET @TableName = '課程表'; SET @CourseID =1; SET @SqlString = 'select * from '+quotename(@TableName) +'where ID = @ID' EXEC sp_executesql @stmt=@SqlString, @params=N'@ID int', @ID=@CourseID
執行結果截圖:
使用輸出參數爲調用批處理中的變量返回值
不做說明,目前暫時沒有用到