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

x6yk4ghg  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(670)

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

  1. CREATE PROCEDURE [dbo].[SearchList]
  2. @command varchar(2000)
  3. AS
  4. BEGIN
  5. SELECT *
  6. FROM XYZ + CONVERT(varchar(2000), @command)
  7. END

我总是出错
将varchar值“order by id desc”转换为数据类型int时,转换失败

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

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

py49o6xq

py49o6xq1#

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

  1. create Procedure [dbo].[SearchList] @command nvarchar(max)
  2. as begin
  3. declare @sql nvarchar(max);
  4. set @sql = N'
  5. select *
  6. from XYZ
  7. ' + @command;
  8. exec sp_executesql @sql;
  9. end;
m2xkgtsf

m2xkgtsf2#

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

  1. CREATE PROCEDURE SPName( @ColumnName varchar(100) ) AS
  2. begin
  3. SELECT * FROM XYZ
  4. ORDER BY
  5. CASE WHEN @ColumnName='COl1' THEN @ColumnName
  6. WHEN @ColumnName='COl2' THEN @ColumnName
  7. WHEN @ColumnName='COl3' THEN @ColumnName
  8. END

方法2

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

或者对where子句和order by使用两个单独的变量,并使用以上的组合

展开查看全部

相关问题