關於SQL Server的Exec實現動態查詢語句

在Sql Server查詢語句中使用變量表示表名、列字段名等動態查詢方式

前言

今天看了《SQL Server數據庫應用技術》的書,遇到的點疑惑也解決了,順便分享一下。我本來也要想做一個JSP的動態網頁,也要用到這個數據庫的查詢語句的知識點,所以正好實用。(注:需要點SQL Server基礎知識)

(一)exec與sp_executesql的區別

EXEC和sp_executesql都是SQL Server提供的兩種動態查詢語句,各有各的優勢,但是比較實用的還是後者,它提供了輸入輸出的接口,而exec是沒有的,最重要的是可以重用執行。一般使用exec語句命令,要麼是執行一個存儲過程,要麼是執行一個動態的查詢過程。

(二)exec的使用

  1. 普通使用SQL語句查詢可以使用以下3種方式:

    select * from TableName
    exec('select * from TableName')
    exec sp_executesql N'select * from TableName' 
  2. 字段名做變量查詢

    declare @course varchar 
    set @course = '課程名'
    Exec('select '+ @course +' from 課程表')

    執行結果截圖是:

    03表變量動態查詢課程名信息

    需要注意的是:

    (2-1)要聲明數據類型的長度,否則會報錯

    04坑1沒有聲明數據類型大小很重要

    (2-2)字符串銜接沒有使用空格

    05坑2沒有使用空格

  3. 表名做變量查詢

        declare @tableName varchar(50) 
        set @tableName = '課程表'
        Exec('select * from '+@TableName)

    06表名做變量查詢結果

    注意事項跟上面一樣

  4. 批處理查詢(多個變量字符串)

        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);

    執行結果截圖:

    08成功結果

    需要注意的是:

    (3-1)要將變量不是字符型的轉換成字符型,否則會報錯,使用cast()轉換

    07注意cast

    (3-2)exec()括號內不允許使用多個變量串聯的字符串,否則會報錯

    09變量串聯字符串查詢

    建議使用多個字符串的變量之間串聯,如:

        exec(@SqlString1+@SqlString2+@SqlString3)
  5. exec()接口問題

    簡單的說就是不支持動態查詢輸入參數和輸出參數,如:

        declare @TableName varchar(50),@XXCourseID varchar(3);
        SET @TableName = '課程表';
        SET @XXCourseID ='5';
        exec('select * from '+quotename(@TableName) +'where 先修課ID = '+@XXCourseID)

(三)sp_executesql的使用

  1. 簡單的查詢

        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,否則會報錯

    10注意查詢語句

  2. 使用接口(支持參數的輸入輸出)

    @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

    執行結果截圖:

    12接口查詢

  3. 使用輸出參數爲調用批處理中的變量返回值

    不做說明,目前暫時沒有用到

參考文獻

發佈了38 篇原創文章 · 獲贊 56 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章