简体   繁体   中英

SQL dynamic query returns NULL

I'm trying to build a dynamic query with dynamic order by condition. But some reason the adhoc query works fine but the same using with sp_executesql returns null. Please advice if anything wrong with the query. Below is the sample data.

   create table resource_statistics (id int , parameter_name varchar(255), parameter_value INT) 
    
    INSERT INTO resource_statistics values (1,'temparature',28);
    INSERT INTO resource_statistics values (2,'humidity',67)
    INSERT INTO resource_statistics values (3,'wind',5)
    INSERT INTO resource_statistics values (4,'wind',28)
    INSERT INTO resource_statistics values (5,'humidity',90)
    INSERT INTO resource_statistics values (6,'humidity',45)
    INSERT INTO resource_statistics values (7,'temparature',38)

Below query returns the correct data set if ! switch the @tvalue with 0 and 1.

declare @test varchar(255)='parameter_name', @tvalue INT=0
select 
parameter_name,parameter_value
from
resource_statistics
ORDER BY 
CASE WHEN @test = 'parameter_name' THEN CASE @tvalue when '1' THEN   parameter_name ELSE NULL END END DESC

Tried to convert the above query to dynmic SQL but on execution results where empty.

declare @test varchar(255)='parameter_name', @tvalue INT=0,@sqlquery NVARCHAR(MAX)
SET @sqlquery='
select 
parameter_name,parameter_value
from
resource_statistics
ORDER BY ' +
CASE WHEN  @test  ='parameter_name' THEN CASE @tvalue  when '1' THEN   'parameter_name' ELSE NULL END END +' DESC'
select @sqlquery
execute sp_executesql @sqlquery

Don't use else NULL . Just use else '' :

declare @test varchar(255) = 'parameter_name',
        @tvalue INT = 0,
        @sqlquery NVARCHAR(MAX);

SET @sqlquery = N'
select parameter_name, parameter_value
from resource_statistics
order by ' +
    (case when  @test = 'parameter_name' and @tvalue = '1' 
          then 'parameter_name'  + ' DESC' else '' end)
select @sqlquery;

execute sp_executesql @sqlquery;

You probably already know that incorporating parameters into a SQL query like this is both a risk for unexpected syntax errors and for SQL injection. However, you are getting NULL because + returns NULL if either operand is NULL .

Your dynamic query cannot be executed as it does not formed properly. I just corrected the issue of forming the dynamic statement.

 declare @sqlquery NVARCHAR(MAX)
  SET @sqlquery='
  declare @test varchar(255)=''parameter_name'', @tvalue INT=0

   select 
    parameter_name,parameter_value
  from  resource_statistics
  ORDER BY 
    CASE WHEN  @test  =''parameter_name'' THEN CASE @tvalue  when ''1'' THEN   
              ''parameter_name'' ELSE NULL END END DESC'
   select @sqlquery
   execute sp_executesql @sqlquery

获得的结果

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM