存储过程未处理动态 where 子句



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

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

我不断收到错误

将 varchar 值"按 ID 排序"转换为数据类型 int 时转换失败

DECLARE @return_value int
EXEC    @return_value = [dbo].[SearchList]
@command = N' ORDER BY Id DESC'
SELECT  'Return Value' = @return_value
GO

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

您可以尝试以下解决方案

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

方法2


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

或者对 Where 子句和排序依据使用两个单独的变量,并使用上述组合

不能混合使用动态 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;

最新更新