首页 > 解决方案 > 存储过程不适用于动态 where 子句

问题描述

我创建了一个存储过程,它有几个选择语句,最后一个条件在@command 中。因为我在 C# 中运行它。

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

我不断收到错误

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

DECLARE @return_value int

EXEC    @return_value = [dbo].[SearchList]
        @command = N' ORDER BY Id DESC'

SELECT  'Return Value' = @return_value
GO

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

标签: sqlsql-serverstored-procedures

解决方案


您可以尝试以下解决方案

CREATE PROCEDURE SPName( @ColumnName varchar(100) ) AS
begin
SELECT * FROM XYZ
ORDER BY
  CASE WHEN @ColumnName='COl1' THEN @ColumnName 
       WHEN @ColumnName='COl2' THEN @ColumnName 
       WHEN @ColumnName='COl3' THEN @ColumnName 

END

方法二


CREATE PROCEDURE SPName( @ColumnName varchar(100)  ) AS
begin
SELECT * FROM XYZ
where 1=1 AND ( COL1= @ColumnName or isnull(@ColumnName ,'')='')
end

或者对 Where Clause 和 Order by 使用两个单独的变量,并使用上述组合


推荐阅读