今天给大家说说动态SQL,这个功能有点强大,下面我来一一介绍一下~

动态SQL可以用于以下几种用途:

  • 自动化管理任务。例如:对于数据库实例中的每个数据库,查询其元数据,为其执行BACKUP DATABASE语句。

  • 改善特定任务的性能。例如,构造参数化的特定查询,以重用以前缓存过的执行计划。

  • 对实际数据进行查询的基础上,构造代码元素。例如,当事先不知道再PIVOT运算符的IN子句中应该出现哪些元素时,动态构造PIVOT查询。

动态SQL有两种执行方式:

使用EXEC(EXECUTE的缩写)命令和使用sp_executersql存储过程。

EXEC命令

EXEC命令是一种执行动态SQL的方法。它接受一个字符串为再圆括号中输入的参数,执行字符串中包含的批处理代码。

以下例子在变量@sql中保存了一个字符串,该字符串中包含一条PRINT语句,再用EXEC调用保存在变量中的批处理代码:

DECLARE @sql AS VARCHAR(100);

SET @sql='PRINT "这条信息被动态SQL打印出来的。";';

EXEC(@sql)

执行结果就是:这条信息被动态SQL打印出来的。

sp_executesql存储过程

sp_executesql存储过程是继EXEC后另一种执行动态SQL的方法。使用这个存储过程更加安全和灵活,因为它支持输入和输出参数。注意的是,与EXEC不同的是,sp_executesql存储过程只支持使用Unicode字符串作为其输入的批处理代码。

sp_executesql存储过程有两个输入参数和一个参数赋值部分。在第一个参数@stmt中,需要指定包含想要运行的批处理代码的Unicode字符串。第二个参数@params是一个Unicode字符串,包含@stmt中所有输入和输出参数的声明。接着为输入和输出参数指定取值,各参数之间用逗号分隔。

下面这个例子构造了一个对Sales.Orders表进行查询的批处理代码,在其查询过滤条件中使用一个输入参数@orderid:

DECLARE @sql AS NVARCHAR(100);

SET @sql=N'SELECT orderid,custid,empid,orderdate FROM Sales.Orders

WHERE orderid=@orderid;';


EXEC sp_executesql

    @stmt=@sql,

    @params=N'@orderid AS INT',

    @orderid=10248;

代码中将输入参数取值指定为10248,但即使采用不同的值在运行这段代码,代码字符串仍然保存相同。这样就可以增加重用以前缓存过的执行计划的机会。

这就是动态SQL的一些简单知识,希望能帮助到大家~

另外更新了几本Oracle和Mysql的电子书到百度云盘了,有需要的可以点击菜单中的学习资料—>电子书即可看到下载地址,以后有好的电子书也会不定时更新进去,欢迎大家关注~

长按下面的二维码关注我们,更多学习经验/教辅资料应有尽有,觉得文章写的不错还望点个赞,感谢您的支持~

SQL Server学习之路(十六)_java