2017-08-29 291 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