我有以下存儲過程。我遇到的問題是「條件」參數。基本上每一個條件是它自己的列,因此它通過像這個 -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)
[不良習慣踢:宣佈'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
結構更容易閱讀,應該更好地執行:'t1.PreferredServiceLocationID = isnull(@LocationId,t1.PreferredServiceLocationID)' –
需要動態sql – scsimon