Sql 存储过程无法使用动态where子句

Sql 存储过程无法使用动态where子句,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我创建了一个存储过程,它有几个select语句,最后一个语句的条件在@命令中。因为我用C语言运行这个 CREATE PROCEDURE [dbo].[SearchList] @command varchar(2000) AS BEGIN SELECT * FROM XYZ + CONVERT(varchar(2000), @command) END 我总是出错 将varchar值“ORDER BY ID DESC”转换为数据类型int时,转换失败 输出返回一个列

我创建了一个存储过程,它有几个select语句,最后一个语句的条件在@命令中。因为我用C语言运行这个

CREATE PROCEDURE [dbo].[SearchList]  
    @command varchar(2000) 
AS
BEGIN
    SELECT * 
    FROM XYZ + CONVERT(varchar(2000), @command)
END
我总是出错

将varchar值“ORDER BY ID DESC”转换为数据类型int时,转换失败


输出返回一个列表,然后将其绑定到网格中

您不能混合使用动态SQL和常规SQL。您需要使整个过程成为动态SQL:

create Procedure [dbo].[SearchList]  @command nvarchar(max) 
as begin
    declare @sql nvarchar(max);
    set @sql = N'
select *
from XYZ
' + @command;

    exec sp_executesql @sql;
end;

你可以试试下面的解决方案

创建过程SPName@ColumnName varchar100作为 开始 从XYZ中选择* 订购人 当@ColumnName='COl1'然后@ColumnName时的情况 当@ColumnName='COl2'时,则@ColumnName 当@ColumnName='COl3'时,则@ColumnName 终止 方法2

创建过程SPName@ColumnName varchar100作为 开始 从XYZ中选择* 其中1=1,COL1=@ColumnName或isnull@ColumnName ,= 终止
或者对Where子句和Order by使用两个单独的变量,并使用上面的组合

这感觉像一个。在使用动态SQL时,应该考虑很多因素,其中一个非常重要的部分是避免注入。为什么需要传递一个动态的ORDER BY呢?它旁边有一个where子句,但为了简化事情,我刚刚编写了ORDER BY。,这听起来更像是一个XY问题。似乎您应该在应用程序层中创建一个参数化查询。如果Gordon在这里提到了注入,@MartinSmith,像OP这样的新语言的人甚至很难理解如何确保这是安全的。考虑到OP想要完全控制WHERE和ORDER,这里需要考虑很多因素,我相对相信这里的方法永远无法正确消毒。老实说,如果需要动态SQL解决方案,我能看到的最好的场景是使用表类型参数,但是WHERE子句requirement.CASE当@ColumnName='COl1'时,@ColumnName将不按列排序,而是按@ColumnName中的任何值排序。这意味着您的订单按案例。。。expression和ORDER BY@ColumnName是同义词。这同样适用于后面的查询。由于@ColumnName是一个标量值,因此每行的值都相同,因此不会应用排序。这就像说ORDER BY SELECT NULL或ORDER BY“任意顺序”。
create Procedure [dbo].[SearchList]  @command nvarchar(max) 
as begin
    declare @sql nvarchar(max);
    set @sql = N'
select *
from XYZ
' + @command;

    exec sp_executesql @sql;
end;