2017-08-29 223 views
1

我有以下存储过程。我遇到的问题是“条件”参数。基本上每一个条件是它自己的列,因此它通过像这个 -SQL - 动态条件Where Where子句

@Conditions =“AND hcc_108 = 1 AND ...”等

我试图做类似这个 -

ALTER PROC [dbo].[GetPatientPanelList] 
(
@CareProviderId int=null, 
@Patient nvarchar(60)=null, 
@Conditions varchar=null, 
@LocationId int=null 

) 

AS 

if @Conditions is null 

SELECT * 
FROM vw_patient_attributes t1 
INNER JOIN STG_OSHODS_DW.osh_rpt.dim_member_care_measures t2 
    ON t1.PatientID = t2.emr_id 
WHERE 
(t1.PreferredServiceLocationID = @LocationId OR @LocationId IS NULL) 
AND (t1.CareProviderID = @CareProviderId OR @CareProviderId IS NULL) 
AND (t1.FullName like '%' + @Patient + '%' OR @Patient IS NULL) 

else 

SELECT * 
FROM vw_patient_attributes t1 
INNER JOIN STG_OSHODS_DW.osh_rpt.dim_member_care_measures t2 
    ON t1.PatientID = t2.emr_id 
WHERE 
(t1.PreferredServiceLocationID = @LocationId OR @LocationId IS NULL) 
AND (t1.CareProviderID = @CareProviderId OR @CareProviderId IS NULL) 
AND (t1.FullName like '%' + @Patient + '%' OR @Patient IS NULL) 
+ @Conditions 

我只需要最后的AND条件基于参数填充。我知道“+”是语法错误,但我似乎无法找出如何实现这一点的方法。

谢谢!

更新

我试图动态SQL,但它口口声声说 “成功完成指令(S))”

这里是我当前的代码。我在一个单独的窗口中编写了此代码,以便首先使查询生效。

DECLARE @where nvarchar(50) = ' and hcc_18 = 1' 
,@sql nvarchar(MAX) , 
@CareProviderId int=null, 
@Patient nvarchar(60)=null, 
@LocationId int=null 

set @sql = 'select * 
FROM vw_patient_attributes t1 
INNER JOIN STG_OSHODS_DW.osh_rpt.dim_member_care_measures t2 
ON t1.PatientID = t2.emr_id 
WHERE t1.PreferredServiceLocationID = IsNull('+ convert(varchar,@LocationId) +',t1.PreferredServiceLocationID) 
AND (t1.CareProviderID = isnull(' + convert(varchar,@CareProviderId)+ ', t1.CareProviderID) 
AND (t1.FullName like %' + @Patient + '% OR ' + @Patient + ' IS NULL)' + @where 

exec(@sql) 
+6

[不良习惯踢:宣布'varchar'没有(长) - 阿龙贝特朗(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09 /bad-habits-to-kick-declaring-varchar-without-length.aspx) - 您应该始终为所有'varchar'或'nvarchar'变量/参数提供一个长度。 - 你的'@Conditions varchar'默认长度为'1'。 http://rextester.com/SDHW82771 – SqlZim

+2

结构更容易阅读,应该更好地执行:'t1.PreferredServiceLocationID = isnull(@LocationId,t1.PreferredServiceLocationID)' –

+0

需要动态sql – scsimon

回答

1

我修复了上次更新的语法问题。这应该工作...

DECLARE @where nvarchar(50) = ' and hcc_18 = 1' 
,@sql nvarchar(MAX) , 
@CareProviderId int=null, 
@Patient nvarchar(60)=null, 
@LocationId int=null 

set @sql = 'select * 
FROM vw_patient_attributes t1 
INNER JOIN STG_OSHODS_DW.osh_rpt.dim_member_care_measures t2 
ON t1.PatientID = t2.emr_id 
WHERE t1.PreferredServiceLocationID = case when '+ convert(varchar(8),isnull(@LocationId,0)) +' = 0 then t1.PreferredServiceLocationID else ' + convert(varchar,isnull(@LocationId,0)) + ' end 
AND (t1.CareProviderID = case when ' + convert(varchar,isnull(@CareProviderId,0)) + ' = 0 then t1.CareProviderID else ' + convert(varchar,isnull(@CareProviderId,0)) + ' end 
AND (t1.FullName like ''%' + isnull(@Patient,'') + '%'' OR ' + isnull(@Patient,0) + '=0)' + @where 

print(@sql) 
--exec(@sql) 
+0

Works !!!非常感谢!! –

+0

没问题@KrazyDev – scsimon