关于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. 使用输出参数为调用批处理中的变量返回值

    不做说明,目前暂时没有用到

参考文献

猜你喜欢

转载自blog.csdn.net/qq_35324453/article/details/80782383