我正在尝试构建一个具有动态order by条件的动态查询。但是出于某种原因,即席查询可以正常工作,但使用with sp_executesql时也会返回null。如果查询有任何问题,请告知。下面是示例数据。
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已尝试将上述查询转换为动态SQL,但执行结果为空。
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发布于 2021-05-28 03:47:26
不要使用else NULL。只需使用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;您可能已经知道,将参数合并到这样的SQL查询中既有发生意外语法错误的风险,也有SQL注入的风险。但是,您得到的是NULL,因为如果任一操作数为NULL,则+返回NULL。
发布于 2021-05-29 10:03:31
您的动态查询无法执行,因为它的格式不正确。我刚刚更正了形成动态语句的问题。
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

https://stackoverflow.com/questions/67728502
复制相似问题