求助,sql问题 -->多条件查询

huangmin3956 2011-04-27 06:03:22
ALTER PROCEDURE [dbo].[HomeAdmin_TaskProgress_SelectAllTaskBySomeCondition_p]
@TaskListId INT
,@TaskContent NVARCHAR(100)=NULL
,@TypeId INT=0
,@PlannerId INT =0
,@TransactorId INT =0
,@FinishState INT =0
,@FinishTime DATETIME =NULL
,@OrderByName NVARCHAR(50)
,@OrderBy NVARCHAR(10)
AS
BEGIN
DECLARE @strSql nvarchar(2000)
set @strSql='
SELECT
TaskId,
TaskListId,
TaskTitle,
TaskContent,
TypeId,
PlannerId,
TransactorId,
FinishState,
FinishTime,
[Plan],
Art,
Cooperation,
Youxian,
CreateAdministratorID,
CreateAdministratorName,
CreateTime
FROM TaskProgress_Task_t
WHERE [DISABLE]=0 AND 1=1 AND TaskListId='+cast(@TaskListId as varchar(10))+'
AND ('+@TaskContent+' IS NULL OR TaskContent LIKE ''%'+@TaskContent+'%'')
AND ('+cast(@TypeId as varchar(10))+'=0 OR TypeId='+cast(@TypeId as varchar(10))+')
AND ('+cast(@PlannerId as varchar(10))+'=0 OR PlannerId='+cast(@PlannerId as varchar(10))+')
AND ('+cast(@TransactorId as varchar(10))+'=0 OR TransactorId='+cast(@TransactorId as varchar(10))+')
AND ('+cast(@FinishState as varchar(10))+'=0 OR FinishState='+cast(@FinishState as varchar(10))+')
AND ('+cast(@FinishTime as varchar(20))+' IS NULL OR FinishTime='+cast(@FinishTime as varchar(10))+')
ORDER BY '+ @OrderByName +' '+@OrderBy

EXEC @strSql

END

上面是存储过程,求助各位了
报错 消息 2812,级别 16,状态 62,过程 HomeAdmin_TaskProgress_SelectAllTaskBySomeCondition_p,第 42 行
找不到存储过程 ''。

@TaskContent ,@TypeId ,@PlannerId ,@TransactorId ,@FinishState ,@FinishTime
我查询的时候根据这几个参数查询,不会知道哪个参数会传值过来 也许会一个值也没有
不知道我说清楚没 谢谢
...全文
204 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangmin3956 2011-04-28
  • 打赏
  • 举报
回复
问题解决了 谢谢各位帅哥美女 (*^__^*) 嘻嘻
yibey 2011-04-27
  • 打赏
  • 举报
回复
所以我最后就采用了3楼的方法来处理了去拼接SQL这样就避免了那个问题。希望你OK
yibey 2011-04-27
  • 打赏
  • 举报
回复
前段时间我跟楼主一样也在写分页查询的功能,想这样写但是发现一连串问题,然后一个个处理,最后到

'+@TaskContent+' IS NULL 这个条件的时候有不可调和的矛盾,如果@TaskContent 是NULL的话这个SQLSTR就会没法拼接了
haitao 2011-04-27
  • 打赏
  • 举报
回复
unicode字符串常量前面要加N

set @strSql=N'
SELECT
TaskId,
TaskListId,
TaskTitle,
...
yibey 2011-04-27
  • 打赏
  • 举报
回复

('+@TaskContent+' IS NULL


如果@TaskContent如果是null的话字符串或者是’ABCD‘的话。那字符串组合起来就变成

AND abcd IS NULL OR TaskContent
那它就把执行的时候就是字段了或者null is NULL的话。那字符串就就不对了
huangmin3956 2011-04-27
  • 打赏
  • 举报
回复
谢谢2喽帅哥 3、4楼的美女 还有5喽的美女 今天就来不急了 明天过来看
总之谢谢了
xyytuo 2011-04-27
  • 打赏
  • 举报
回复
叶子 2011-04-27
  • 打赏
  • 举报
回复
你可以类似这样判断一下:

set @strSql='
SELECT
TaskId,
TaskListId,
TaskTitle,
TaskContent,
TypeId,
PlannerId,
TransactorId,
FinishState,
FinishTime,
[Plan],
Art,
Cooperation,
Youxian,
CreateAdministratorID,
CreateAdministratorName,
CreateTime
FROM TaskProgress_Task_t
WHERE [DISABLE]=0 AND 1=1 '
+isnull('AND TaskListId='+cast(@TaskListId as varchar(10)),'')

条件都用isnull拼接,当条件为null,整体就null了,就变成''了。
叶子 2011-04-27
  • 打赏
  • 举报
回复
你现在报错的原因是
EXEC @strSql 要改成 EXEC (@strSql)
没有括号的话 sql server 自动识别为存储过程名

----------
你现在的这些参数可以为null null加减剩除任何值都为null
所以你这样写不行。
luofenghen 2011-04-27
  • 打赏
  • 举报
回复
最好用判断

@sql=' SELECT
TaskId,
TaskListId,
TaskTitle,
TaskContent,
TypeId,
PlannerId,
TransactorId,
FinishState,
FinishTime,
[Plan],
Art,
Cooperation,
Youxian,
CreateAdministratorID,
CreateAdministratorName,
CreateTime
FROM TaskProgress_Task_t
WHERE [DISABLE]=0 AND 1=1 '

if @TaskContent<>''
begin
@sql=@sql + 'TaskContent LIKE ''%'+@TaskContent+'%''
end
.
.

.
.


huangmin3956 2011-04-27
  • 打赏
  • 举报
回复
0.0
huangmin3956 2011-04-27
  • 打赏
  • 举报
回复
来人啊

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧