c# - 如何将空值传递给sql中的存储过程

标签 c# mysql sql oracle stored-procedures

这是我的存储过程,它从列表框中获取输入并显示与所选项目相关的记录。但如果我不从列表框中选择任何内容,那么它需要显示所有未发生的记录。

这是我的存储过程

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

最佳答案

您不需要为此目的使用动态 sql。使用IFNULLWHERE 语句中,如果您使用的是 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

关于c# - 如何将空值传递给sql中的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40102147/

相关文章:

c# - 删除 ToolStripControlHost 周围的空白

c# - TCPClient 连接到 Gmail 但未收到第一条消息

c# - 访问处置关闭

mysql - 不知道如何合并两个MySQL表

MYSQL 允许我在 PK 和 FK 中插入空值

java - 我可以使用Java代码在sql语句(Oracle)的IN子句中传递一个字符串列表吗

c# - EF 忽略预加载 "Include"语句

mysql - mysql中外键引用的主键可以是varchar(255)吗?

php - 使用两个模型循环 Laravel 模型

SQL Server - 具有 2 个组变量和 2 个聚合计算的动态透视