问个查询的问题

FrameSniper 2008-10-14 08:54:26
create procedure udsp_SelectOperationEnterprise
@AreaName nvarchar(16)
as
declare @AreaIndex smallint
set @AreaIndex=isnull(@AreaName,null)
if (@AreaIndex<>null)
set @AreaIndex=isnull((select oeaf_Index from udfdt_OperationEnterpriseArea where oeaf_Name=@AreaName),0)
declare @SelectStatement nvarchar(4000)
set @SelectStatement='select (select oeaf_Name from udfdt_OperationEnterpriseArea where oeaf_Index='+convert(nvarchar(10),@AreaIndex)+') 隶属地区
from udsdt_OperationEnterprise where oef_AreaIndex='+isnull(convert(nvarchar(10),@AreaIndex),'oef_AreaIndex')

execute(@SelectStatement)


这个是我的存储过程,其中操作的有两个表,是主细表的关系。其中udfdt_OperationEnterpriseArea是主表,表示业务单位的归属地。udsdt_OperationEnterprise是细表,表示业务单位的其他内容。也就是说细表中有一个字段放着的是主表中oeaf_Index字段的值。

现在有一个界面,其中有一个下拉框,下拉后显示的内容是主表中与oeaf_Index字段对应的oeaf_Name名称内容。我现在要根据这个条件来让客户做查询

现在情况分为如下类别

一、客户没有选择任何东西,下拉框内容是空的。这个时候执行存储过程的时候会因为@AreaName为空将@AreaIndex也设置为空,最后查询条件形成恒等式。可以查出所有内容。
二、如果客户选择或填写了,这个时候因为@AreaName不为空,所以@AreaIndex要么为0要么为其他实际存在的值。达到实际查询的目的。

各位帮忙看看这个存储过程可以实现这个功能吗?


...全文
202 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
cathen0023 2008-10-16
  • 打赏
  • 举报
回复
啊,来学习一下
chuifengde 2008-10-16
  • 打赏
  • 举报
回复
DECLARE @Name nvarchar(16), @SuperiorDeptName nvarchar(16) 
SELECT @Name='1',@SuperiorDeptName=' '

declare @SuperiorDeptIndex smallint
declare @SelectStatement nvarchar(512)


if datalength(rtrim(ltrim(@SuperiorDeptName)))=0
set @SuperiorDeptIndex=null
else
set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)

SELECT @SuperiorDeptIndex

set @SelectStatement='select df_Index 流水号,df_Name 名称,(select df_Name from udfdt_Department where df_Index='+isnull(ltrim(@SuperiorDeptIndex),'df_SuperiorDeptIndex')+') 上级部门
from udfdt_Department where df_Name='+isnull(''''+@Name+'''','df_name')+' and df_SuperiorDeptIndex='+isnull(ltrim(@SuperiorDeptIndex),'df_SuperiorDeptIndex')

PRINT @SelectStatement
FrameSniper 2008-10-16
  • 打赏
  • 举报
回复
create procedure udsp_SelectDepartment
@Name nvarchar(16),
@SuperiorDeptName nvarchar(16)
as
declare @SuperiorDeptIndex smallint
if datalength(rtrim(ltrim(@SuperiorDeptName)))=0
set @SuperiorDeptIndex=null
else
set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)
declare @SelectStatement nvarchar(512)
set @SelectStatement='select df_Index 流水号,df_Name 名称,(select df_Name from udfdt_Department where df_Index='+convert(nvarchar(10),@SuperiorDeptIndex)+') 上级部门
from udfdt_Department where df_Name='+isnull('''' + @Name + '''','df_name')+' and df_SuperiorDeptIndex='+isnull(convert(nvarchar(10),@SuperiorDeptIndex),'df_SuperiorDeptIndex')
execute(@SelectStatement)

go

exec udsp_selectdepartment "1"," "

这个是我的测试代码,我重新写了一下内容,用datalength来判断rtrim(ltrim(@SuperiorDeptName))是否为0,如果为0说明客户在界面上并没有选择相应的查询条件,这个时候把@SuperiorDeptIndex设置为null。在进行最后的查询的时候,通过事先把@SuperiorDeptIndex设置为null而让当前这个查询条件为恒等

如果datalength(rtrim(ltrim(@SuperiorDeptName)))不为0,说明用户选择或输入了查询的条件,我界面上使用的是一个可以直接输入的combobox控件。这个时候,来对输入内容进行事先的select查询,如果什么都查补出来则把@SuperiorDeptIndex设置为null。最后页通过最后的查询设置为恒等

我最后测试了一下,使用语句 exec udsp_selectdepartment “1”,“ ”

第二个参数带了一个包含一个空格的字符。按道理rtrim(ltrim(@SuperiorDeptName))后第二个参数就成了空字符串,就是什么都没有。这个时候datalength应该是返回0.但这里实际的查询结果是什么都差不出来
FrameSniper 2008-10-15
  • 打赏
  • 举报
回复
没人会吗?会的麻烦帮我看看!
FrameSniper 2008-10-14
  • 打赏
  • 举报
回复
公司要求用动态SQL
hyde100 2008-10-14
  • 打赏
  • 举报
回复
不用存储过程,直接用sql也不出来?
FrameSniper 2008-10-14
  • 打赏
  • 举报
回复
create procedure udsp_SelectDepartment
@Name nvarchar(16),
@SuperiorDeptName nvarchar(16)
as
declare @SuperiorDeptIndex smallint
set @SuperiorDeptIndex=isnull(@SuperiorDeptName,null)
if (@SuperiorDeptName is not null)
select @SuperiorDeptIndex=isnull(df_Index,0) from udfdt_Department where df_Name=@SuperiorDeptName
-- set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)
declare @SelectStatement nvarchar(512)
set @SelectStatement='select df_Index 流水号,df_Name 名称,(select df_Name from udfdt_Department where df_Index='+convert(nvarchar(10),@SuperiorDeptIndex)+') 上级部门
from udfdt_Department where df_Name='+isnull('''' + @Name + '''','df_name')+' and df_SuperiorDeptIndex='+isnull(convert(nvarchar(10),@SuperiorDeptIndex),'df_SuperiorDeptIndex')
execute(@SelectStatement)

go

exec udsp_selectdepartment "1"," "

这个是我实际的代码。但结果就是什么都查不出来,查询的时候表中是有对应记录存在的
hyde100 2008-10-14
  • 打赏
  • 举报
回复
create procedure udsp_SelectOperationEnterprise
@AreaName nvarchar(16)
as
不是一个参数吗?
pt1314917 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 FrameSniper 的回复:]
to 楼上各位

我按照你们说的方式改写了一下,然后使用下面的语句来执行看结果

exec udsp_selectdepartment "1"," "

但还是查不出任何东西,当前表中是有符合条件的记录的
[/Quote]

你这存储过程不是只有一个参数的么?怎么这样调用?
FrameSniper 2008-10-14
  • 打赏
  • 举报
回复
恩,还是查不出任何东西
水族杰纶 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 FrameSniper 的回复:]
select @SuperiorDeptIndex=isnull(df_Index,0) from udfdt_Department where df_Name=@SuperiorDeptName

set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)


麻烦问一下,这两个话我感觉没什么区别,不知道这种想法对不对

对于第一句先select,然后判断df_index是否为空

和第二句也是先select,最后判断select返回内容是否为空,感觉差不多,请赐教!
[/Quote]
--效果一樣
declare @num int
declare @t table(ID int identity(1,1),Num int)
insert @t select 1
insert @t select 2
insert @t select null
select @num=isnull(num,0) from @t where id=2
print @num
select @num=isnull((select num from @t where id=2),0)
print @num
/*
2
2

*/
FrameSniper 2008-10-14
  • 打赏
  • 举报
回复
to 楼上各位

我按照你们说的方式改写了一下,然后使用下面的语句来执行看结果

exec udsp_selectdepartment "1"," "

但还是查不出任何东西,当前表中是有符合条件的记录的
hyde100 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 FrameSniper 的回复:]
select @SuperiorDeptIndex=isnull(df_Index,0) from udfdt_Department where df_Name=@SuperiorDeptName

set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)


麻烦问一下,这两个话我感觉没什么区别,不知道这种想法对不对

对于第一句先select,然后判断df_index是否为空

和第二句也是先select,最后判断select返回内容是否为空,感觉差不多,请赐教!
[/Quote]
效果一样,都是判断转换结果
pt1314917 2008-10-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 FrameSniper 的回复:]
select @SuperiorDeptIndex=isnull(df_Index,0) from udfdt_Department where df_Name=@SuperiorDeptName

set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)


麻烦问一下,这两个话我感觉没什么区别,不知道这种想法对不对

对于第一句先select,然后判断df_index是否为空

和第二句也是先select,最后判断select返回内容是否为空,感觉差不多,请赐教!
[/Quote]

是一样的。。。5楼的不行么?
FrameSniper 2008-10-14
  • 打赏
  • 举报
回复
select @SuperiorDeptIndex=isnull(df_Index,0) from udfdt_Department where df_Name=@SuperiorDeptName

set @SuperiorDeptIndex=isnull((select df_Index from udfdt_Department where df_Name=@SuperiorDeptName),0)


麻烦问一下,这两个话我感觉没什么区别,不知道这种想法对不对

对于第一句先select,然后判断df_index是否为空

和第二句也是先select,最后判断select返回内容是否为空,感觉差不多,请赐教!
csdyyr 2008-10-14
  • 打赏
  • 举报
回复
麻烦告诉一下是否有 if (@AreaIndex is not null)这种用法
--正確
FrameSniper 2008-10-14
  • 打赏
  • 举报
回复
to suvi

if (@AreaIndex <>null) ?

I don't think so.

In sql db, It should be (@AreaIndex is null) or ISNULL(@AreaIndex).

null is not a value, cannot use ==, <> !=

但是isnull函数返回的类型和我要求的不一样,如果isnull返回的是表示真假的boolean类型,那么我可以直接用isnull来判断条件,但实际情况是不是

所以才考虑用if语句做判断

麻烦告诉一下是否有 if (@AreaIndex is not null)这种用法
chuifengde 2008-10-14
  • 打赏
  • 举报
回复
create procedure udsp_SelectOperationEnterprise 
@AreaName nvarchar(16)
as
declare @AreaIndex smallint
declare @SelectStatement nvarchar(4000)

IF @AreaName IS NOT NULL
select @AreaIndex=isnull(oeaf_Index,0) from udfdt_OperationEnterpriseArea where oeaf_Name=@AreaName

set @SelectStatement='select (select oeaf_Name from udfdt_OperationEnterpriseArea where oeaf_Index='+convert(nvarchar(10),@AreaIndex)+') 隶属地区
from udsdt_OperationEnterprise where oef_AreaIndex='+isnull(convert(nvarchar(10),@AreaIndex),'oef_AreaIndex')

execute(@SelectStatement)
pt1314917 2008-10-14
  • 打赏
  • 举报
回复

--哦还有点问题
--这样?
create procedure udsp_SelectOperationEnterprise
@AreaName nvarchar(16)=null
as
declare @AreaIndex smallint
set @AreaIndex=isnull(@AreaName,null)
if (@AreaIndex is not null)
select @AreaIndex=isnull(oeaf_Index,0) from udfdt_OperationEnterpriseArea where oeaf_Name=@AreaName
select 隶属地区=oeaf_Name from udfdt_OperationEnterpriseArea where oeaf_Index=isnull(@AreaIndex ,oeaf_Index)

pt1314917 2008-10-14
  • 打赏
  • 举报
回复

--这样?
create procedure udsp_SelectOperationEnterprise
@AreaName nvarchar(16)=null
as
declare @AreaIndex smallint
set @AreaIndex=isnull(@AreaName,null)
if (@AreaIndex<>null)
select @AreaIndex=isnull(oeaf_Index,0) from udfdt_OperationEnterpriseArea where oeaf_Name=@AreaName
select 隶属地区=oeaf_Name from udfdt_OperationEnterpriseArea where oeaf_Index=isnull(@AreaIndex ,oeaf_Index)
加载更多回复(2)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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