2016-10-18 70 views
0

这是我的存储过程,它从列表框中输入并显示与选定项目相关的记录。但如果我不从列表框中选择任何东西,那么它需要显示所有没有发生的记录。如何将空值传递给sql中的存储过程

这是我的存储过程

USE [MyDb] 
GO 
/****** Object: StoredProcedure [dbo].[usp_SearchCAMAFunctionalObsolescence] Script Date: 10/18/2016 12:30:08 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[usp_SearchCAMAFunctionalObsolescence] 
@section as nvarchar(max), 
@quality as nvarchar(max), 
@style as nvarchar(max) 

As 
Begin 

set nocount on; 
Declare @Where as varchar(max) 
Declare @Select as varchar(max) 

Set @Select = ' Distinct vi.struct_no as structure,a.assesmt_no as assessment,a.parcel_no as parcel, o.own_last+'' , ''+o.own_first as taxpayer, id.year_built as built, id.effect_age as age, id.mkt_adj as fo, vi.aprais_val as mktvalue 
        From assessments a 
        inner join parcel p on a.parcel_no = p.parcel_no 
        inner join valueimp vi on vi.assesmt_no = a.assesmt_no 
        inner join owner o on o.id = a.owner_id 
        inner join imp_details id on id.improvementId = vi.id and (id.isdeleted is null or id.isdeleted = 0) 
        inner join quality_details qd on qd.quality_id = id.quality_id 
        inner join section_details sd on sd.section_id = id.section_id 
        inner join style_details stdl on stdl.style_id = id.style_id' 



Set @Where = ' where (' + @section + ' is null or sd.section_id = ' + @section + ') and (' + @quality + ' is null or qd.quality_id = ' + @quality + ') and (' + @style + ' is null or stdl.style_id = ' + @style + ')' 


DECLARE @QUERY NVARCHAR(MAX)  

SET @QUERY= 'Select '+ @SELECT + @WHERE 
print @QUERY 
EXEC sp_executesql @QUERY , N'@section as int ,@quality as int,@style as int' ,@section ,@quality,@style 

END 

if i execute stored procedure in this way 
// EXEC usp_SearchCAMAFunctionalObsolescence 'null','null','null' 
it display all records. 

but i need to execute stored procedure in this way 
// EXEC usp_SearchCAMAFunctionalObsolescence null,null,null 
and it not display anything 
+0

c#code?_______ – Imad

+0

您是使用MySQL还是Oracle - 或者其他一些dbms?不要标记不涉及的产品。 – jarlh

回答

1

您不需要为此目的使用动态sql。在WHERE语句中使用IFNULL,如果你正在使用MySQL。(对于SQL Server使用ISNULL和使用Oracle的NVL代替。)

如果输入变量为空,那么脚本将返回实际列值。

USE [MyDb] 
GO 
/****** Object: StoredProcedure [dbo].[usp_SearchCAMAFunctionalObsolescence] Script Date: 10/18/2016 12:30:08 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[usp_SearchCAMAFunctionalObsolescence] 
@section as nvarchar(max), 
@quality as nvarchar(max), 
@style as nvarchar(max) 

As 
Begin 

set nocount on; 

SELECT Distinct vi.struct_no as structure,a.assesmt_no as assessment,a.parcel_no as parcel, o.own_last+'' , ''+o.own_first as taxpayer, id.year_built as built, id.effect_age as age, id.mkt_adj as fo, vi.aprais_val as mktvalue 
        From assessments a 
        inner join parcel p on a.parcel_no = p.parcel_no 
        inner join valueimp vi on vi.assesmt_no = a.assesmt_no 
        inner join owner o on o.id = a.owner_id 
        inner join imp_details id on id.improvementId = vi.id and (id.isdeleted is null or id.isdeleted = 0) 
        inner join quality_details qd on qd.quality_id = id.quality_id 
        inner join section_details sd on sd.section_id = id.section_id 
        inner join style_details stdl on stdl.style_id = id.style_id 
WHERE sd.section_id =IFNULL(@section,sd.section_id) 
    AND qd.quality_id = IFNULL(@quality,qd.quality_id) 
    AND stdl.style_id = IFNULL(@style,stdl.style_id) 

END 
0

为什么不创建一个存储过程返回筛选结果,然后调用,在你的代码时没有进行选择?

CREATE PROCEDURE [dbo].[usp_SearchCAMAFunctionalObsolescenceUnfiltered] 
As 
Begin 

set nocount on; 

SELEcT Distinct vi.struct_no as structure,a.assesmt_no as assessment,a.parcel_no as parcel, o.own_last+'' , ''+o.own_first as taxpayer, id.year_built as built, id.effect_age as age, id.mkt_adj as fo, vi.aprais_val as mktvalue 
From assessments a 
inner join parcel p on a.parcel_no = p.parcel_no 
inner join valueimp vi on vi.assesmt_no = a.assesmt_no 
inner join owner o on o.id = a.owner_id 
inner join imp_details id on id.improvementId = vi.id and (id.isdeleted is null or id.isdeleted = 0) 
inner join quality_details qd on qd.quality_id = id.quality_id 
inner join section_details sd on sd.section_id = id.section_id 
inner join style_details stdl on stdl.style_id = id.style_id 

END 
相关问题