2017-08-29 10 views
1

私は以下のストアドプロシージャを持っています。私が抱えている問題は、「条件」パラメータです。それはthis-SQL - Where節の動的条件

@Conditions =「AND hcc_108 = 1、...」など

のように私はthis-

ような何かをしようとしている渡されたので、基本的にはそれぞれの条件は、独自の列であります
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を試してみましたが、それは "正常に完了したコマンド(複数可))"

はここに私の現在のコードであると言って続けています。別のウィンドウでこれを書いて、最初にクエリを機能させるようにしました。

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'変数/パラメータの長さを指定してください。 - あなたの '@Constitions 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