sp_executesql和存储过程中组合SQL语句

存储过程有时候要实现比复杂的方法,其中有的手段就是要组合sql语句

declare @TestSql nvarchar(1000)

set @TestSql = 'select * from tablename'

就像这种方式一样,当然上面的只是一个事例

组合sql要先区分几种错误的概念

1,对于表名,列名,字段名都是不能使用变量的。

比如这个方式

declare @tableName varchar(100)

declare @Sql varchar(1000)

set @tableName ='userinfo'

set @Sql = 'select * from @tableName'

执行这种方式是会报错的。字段也是其中道理

组合sql,最后使用exec(@Sql)可以执行,这是一种比较简单实现方式,就是一个参数,组合的sql语句。

另外一种是比较复杂的方式就是sp_executesql,这个方式也是执行组合sql,但是功能 更多,更强大。因为他是可以嵌入参数的

sp_executesql [ @stmt = ] stmt
[
    {, [@params=] N'@parameter_name data_type [ [ OUT [ PUT ][,...n]' }
     {, [ @param1 = ] 'value1' [ ,...n ] }
]

这是语法格式。第一个参数就是组合的sql语句,后面的就是参数。

一个例子
DECLARE @SQLString nvarchar(500);

SET @SQLString = N'SELECT * FROM AdventureWorks.HumanResources.Employee   WHERE ManagerID = @ManagerID';
EXECUTE sp_executesql @SQLString,  N'@ManagerID tinyint', @ManagerID = 200

需要注意的是组合sql必须是nvarchar,ntext类型,字符串前面可以加N字母。

后面参数的具体格式。就是组合sql,第二就是sql中出现的@变量。声明他的类型,第3个参数就是对参数赋值

2,一个复杂例子,多个参数和参数输出类型

现在组合sql中多个参数,而且要求有输出参数,就是那个数量。我也是在编程中发现这个问题,才研究sp_executesql的

declare @Sql nvarchar(500)

declare @Count int

set @Sql = 'select @num = count(*) from tableName where uid = @UID'
EXECUTE sp_executesql @Sql,'@num int output,@UID int',@Count output,@UID =3

print @Count

这样就ok了

需要注意的是。第二个输入参数中的sql中参数,必须按先后顺序进行声明。否则就有错误,我测试中是这样的。

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

原文地址:https://www.cnblogs.com/zjypp/p/2319414.html