sql - 存储过程不适用于动态 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
输出返回一个列表,然后我将其绑定到网格中。
解决方案
您可以尝试以下解决方案
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 使用两个单独的变量,并使用上述组合
推荐阅读
- c# - 即使实体框架核心中的模型没有任何更新,DateTime 属性也会导致新的迁移更新
- javascript - D3 折线图红线为零值
- latex - 线图图例阻碍视图,将其移到外面?
- wordpress - 通过 post 请求将 wordpress 表单数据发送到 odoo 以获取潜在客户
- tslint - tslint:如何确保变量不是未定义的?
- php - 使用 html 下拉菜单单击更改 PHP 项目
- php - 只有当用户查看自己的个人资料而不是其他人的个人资料时,我才能使某些文本对用户可见?
- python-3.x - 如何使按钮在文本更改长度时保持原位
- mysql - Laravel 错误:违反完整性约束
- visual-foxpro - 如何使用like函数检查字符表达式是否在文本开头包含“*”