sqlserver中动态sql语句应用

前言

一、使用exec

1.用拼接方法

二、使用sp_executesql

1.用拼接方法

2.传参的方法

总结



前言

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


一、使用exec

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

1.用拼接方法

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

代码如下(示例):

declare @AuthorName nvarchar(20)
declare @Price int
declare @PubTime date
declare @sql  nvarchar(max); 
set @sql='select * from book where 1=1 ';

--找出某位作者的书
set @AuthorName='小王'
if(ISNULL(@AuthorName,'')<>'')		
begin
set @sql=@sql+ 'and AuthorName='''+@AuthorName+'''';
end

--找出符合价格的书
set @Price=60;
if(ISNULL(@Price,'')<>'')		
begin
set @sql=@sql+ 'and Price='''++CAST(@Price as nvarchar)+''''
end

set @PubTime='2023-04-01'
--找某个月的出版的书
if(ISNULL(@PubTime,'')<>'')		
begin
set @sql=@sql+ 'and PubTime>=DATEADD(MONTH, DATEDIFF(MONTH, 0,'''+cast(@PubTime as nvarchar)+'''), 0)' --某月的第一天
set @sql=@sql+'and  PubTime<=DATEADD(MONTH, DATEDIFF(MONTH, -1,'''+cast(@PubTime as nvarchar)+'''), -1)' --某月的最后一天
end


exec(@sql)
print  @sql
 

 返回结果

sqlserver中动态sql语句应用_第1张图片

二、使用sp_executesql

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

1.用拼接方法

获取小王出版的所有的书

代码如下(示例):

    declare @sql nvarchar(300)
    declare @AuthorName nvarchar(500)
    set @AuthorName='小王'
    set @sql = 'SELECT count(1) FROM book where  AuthorName='''+@AuthorName+''''
    --方式1
    exec sp_executesql @sql
    --方式二
    --exec(@sql)
    print @sql
返回结果

sqlserver中动态sql语句应用_第2张图片

 

2.传参的方法

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

代码如下(示例):

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

sqlserver中动态sql语句应用_第3张图片


三、应用上

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

 在表值函数使用exec、sp_executesql

 代码如下(示例):

CREATE FUNCTION fntest
(
@AuthorName nvarchar(500)
)
RETURNS 
@t TABLE 
(
	   [Id] int 
      ,[AuthorName] nvarchar
      ,[Price] float
      ,[PubTime] datetime
      ,[Title]  nvarchar
)
AS
BEGIN
	
    declare @sql nvarchar(300)
    set @sql = ' SELECT * FROM book where  AuthorName='''+@AuthorName+''''
    
	insert into @t
	exec(@sql)
	RETURN 
END

返回结果

总结

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

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

你可能感兴趣的:(sql)