当前位置:   article > 正文

sqlserver中动态sql语句应用_sqlserver动态sql

sqlserver动态sql

前言

一、使用exec

1.用拼接方法

二、使用sp_executesql

1.用拼接方法

2.传参的方法

总结



前言

例如:列表查询条件不固定,根据前端传过来的参数,这时需要根据查询条件后台动态生成SQL语句


一、使用exec

exec适用于字符串拼接的方式,如果参数是非nvarchar类型需要转化成此类型做拼接

1.用拼接方法

例如:我要找出某位作者在合适价格的书一个月出版书

代码如下(示例):

  1. declare @AuthorName nvarchar(20)
  2. declare @Price int
  3. declare @PubTime date
  4. declare @sql nvarchar(max);
  5. set @sql='select * from book where 1=1 ';
  6. --找出某位作者的书
  7. set @AuthorName='小王'
  8. if(ISNULL(@AuthorName,'')<>'')
  9. begin
  10. set @sql=@sql+ 'and AuthorName='''+@AuthorName+'''';
  11. end
  12. --找出符合价格的书
  13. set @Price=60;
  14. if(ISNULL(@Price,'')<>'')
  15. begin
  16. set @sql=@sql+ 'and Price='''++CAST(@Price as nvarchar)+''''
  17. end
  18. set @PubTime='2023-04-01'
  19. --找某个月的出版的书
  20. if(ISNULL(@PubTime,'')<>'')
  21. begin
  22. set @sql=@sql+ 'and PubTime>=DATEADD(MONTH, DATEDIFF(MONTH, 0,'''+cast(@PubTime as nvarchar)+'''), 0)' --某月的第一天
  23. set @sql=@sql+'and PubTime<=DATEADD(MONTH, DATEDIFF(MONTH, -1,'''+cast(@PubTime as nvarchar)+'''), -1)' --某月的最后一天
  24. end
  25. exec(@sql)
  26. print @sql

 返回结果

二、使用sp_executesql

 比exec更加灵活,及支持字符串拼接的方式,并且 支持参数化

1.用拼接方法

获取小王出版的所有的书

代码如下(示例):

  1.     declare @sql nvarchar(300)
  2. declare @AuthorName nvarchar(500)
  3. set @AuthorName='小王'
  4.     set @sql = 'SELECT count(1) FROM book where AuthorName='''+@AuthorName+''''
  5. --方式1
  6.     exec sp_executesql @sql
  7. --方式二
  8. --exec(@sql)
  9. print @sql
返回结果

 

2.传参的方法

    比如 输出小王共计出版了多少本书,并用一个变量接收

代码如下(示例):

  1.     declare @sql nvarchar(300)
  2. declare @AuthorName nvarchar(500)
  3. declare @Num int;
  4. set @AuthorName='小王'
  5.     set @sql = 'SELECT @Num=count(1) FROM book where AuthorName=@AuthorName'
  6.     exec sp_executesql @sql,N'@AuthorName nvarchar(300),@Num int out'@AuthorName@Num  out
  7. --exec(@sql)
  8. select @Num as 数量
  9. PRINT @Num
返回结果


三、应用上

 支持在存储过程里使用,不支持在FUNCTIO函数的使用

 在表值函数使用exec、sp_executesql

 代码如下(示例):

  1. CREATE FUNCTION fntest
  2. (
  3. @AuthorName nvarchar(500)
  4. )
  5. RETURNS
  6. @t TABLE
  7. (
  8. [Id] int
  9. ,[AuthorName] nvarchar
  10. ,[Price] float
  11. ,[PubTime] datetime
  12. ,[Title] nvarchar
  13. )
  14. AS
  15. BEGIN
  16.     declare @sql nvarchar(300)
  17.     set @sql = ' SELECT * FROM book where AuthorName='''+@AuthorName+''''
  18. insert into @t
  19. exec(@sql)
  20. RETURN
  21. END

返回结果

总结

exec 只适用于拼接的方式,而sp_executesql更加灵活,不仅用拼接方式,而且支持参数化

exec、sp_executesql 动态拼接的方式 适用在存储过程中使用,不支持在表值函数、标量函数中使用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/556573
推荐阅读
相关标签
  

闽ICP备14008679号