Sql server 如何将语句放入变量并在存储过程中多次使用
我已经创建了一个存储过程,其中一个case语句将被使用5次,那么有没有办法创建一个SQL变量,以便我可以多次使用该变量? 我已经创建了一个存储过程,其中一个case语句将被使用5次,那么有没有办法创建一个SQL变量,以便我可以多次使用该变量 @名称\u Level1 varchar(100)=空, @pk_标识_ID varchar(100)=空 ASSql server 如何将语句放入变量并在存储过程中多次使用,sql-server,stored-procedures,Sql Server,Stored Procedures,我已经创建了一个存储过程,其中一个case语句将被使用5次,那么有没有办法创建一个SQL变量,以便我可以多次使用该变量? 我已经创建了一个存储过程,其中一个case语句将被使用5次,那么有没有办法创建一个SQL变量,以便我可以多次使用该变量 @名称\u Level1 varchar(100)=空, @pk_标识_ID varchar(100)=空 AS 开始 声明@JoiningDateChkforRule日期=null 声明@MPHILDateChkforRule date=null 声明@c
开始
声明@JoiningDateChkforRule日期=null 声明@MPHILDateChkforRule date=null 声明@caseVar varchar(最大值)
设置@caseVar='' SET@JoiningDateChkforRule='1991-09-19 00:0:00.000' 设置为“1993-12-31 00:0:00.000”
set @Sql='SELECT Distinct SR.pk_employee_ID ,ISNULL(Last_Name,'''')+ '' ''+ISNULL(First_Name,'''')+'' ''+ISNULL(Middle_Name,'''') AS EmpName,Emp_Code,
TJoiningDateforRuleDesg.JoiningDateforRuleDesg,
-- if main designation and rule designation are same
--Main designation
CASE '+@pk_Designation_ID+'
WHEN ' +cast(@pk_Designation_IDForRule as varchar) +' THEN
--******************
CASE WHEN DATEDIFF(DAY, TJoiningDateforRuleDesg.JoiningDateforRuleDesg, '+cast(@JoiningDateChkforRule as varchar)+') > 0
THEN TJoiningDateforRuleDesg.JoiningDateforRuleDesg
ELSE
CASE WHEN DATEDIFF(day, isnull(NETSETQual.NETSETPassing_Date,MPHILQual.MPHILQualPassing_Date), isnull(MPHILQual.MPHILQualPassing_Date,NETSETQual.NETSETPassing_Date)) >= 0
THEN
CASE WHEN DATEDIFF(day, NETSETQual.NETSETPassing_Date, TJoiningDateforRuleDesg.JoiningDateforRuleDesg) <= 0
THEN NETSETQual.NETSETPassing_Date
ELSE
CASE WHEN NETSETQual.NETSETPassing_Date IS NULL
THEN
CASE WHEN DATEDIFF(DAY, MPHILQual.MPHILQualPassing_Date,'+CAST(@MPHILDateChkforRule as varchar) +')<= 0
THEN MPHILQual.MPHILQualPassing_Date
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
END
ELSE
CASE WHEN DATEDIFF(day, MPHILQual.MPHILQualPassing_Date, TJoiningDateforRuleDesg.JoiningDateforRuleDesg) <= 0
THEN
CASE WHEN DATEDIFF(DAY, MPHILQual.MPHILQualPassing_Date,'+CAST(@MPHILDateChkforRule as varchar) +') <= 0
THEN MPHILQual.MPHILQualPassing_Date
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
END
END
--******************
ELSE -- if main designation and rule designation are different
(Select min(Joining_Date) from HRMS_Employee_ServiceRecord (nolock)
where fk_Designation_ID in (SELECT * from dbo.Split('''+@pk_Designation_ID+''','',''))
and pk_Employee_ID = SR.pk_Employee_ID)
END as Senority_Joining_For_Order,
-- Level_1_Designation
CASE '+@Designation_Level1+'
WHEN '+cast(@pk_Designation_IDForRule as varchar) +' THEN
--******************
CASE WHEN DATEDIFF(DAY, TJoiningDateforRuleDesg.JoiningDateforRuleDesg, '+cast(@JoiningDateChkforRule as varchar)+') > 0
THEN TJoiningDateforRuleDesg.JoiningDateforRuleDesg
ELSE
CASE WHEN DATEDIFF(day, isnull(NETSETQual.NETSETPassing_Date,MPHILQual.MPHILQualPassing_Date), isnull(MPHILQual.MPHILQualPassing_Date,NETSETQual.NETSETPassing_Date)) >= 0
THEN
CASE WHEN DATEDIFF(day, NETSETQual.NETSETPassing_Date, TJoiningDateforRuleDesg.JoiningDateforRuleDesg) <= 0
THEN NETSETQual.NETSETPassing_Date
ELSE
CASE WHEN NETSETQual.NETSETPassing_Date IS NULL
THEN
CASE WHEN DATEDIFF(DAY, MPHILQual.MPHILQualPassing_Date,'+CAST(@MPHILDateChkforRule as varchar) +')<= 0
THEN MPHILQual.MPHILQualPassing_Date
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
END
ELSE
CASE WHEN DATEDIFF(day, MPHILQual.MPHILQualPassing_Date, TJoiningDateforRuleDesg.JoiningDateforRuleDesg) <= 0
THEN
CASE WHEN DATEDIFF(DAY, MPHILQual.MPHILQualPassing_Date,'+CAST(@MPHILDateChkforRule as varchar) +') <= 0
THEN MPHILQual.MPHILQualPassing_Date
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
ELSE TJoiningDateforRuleDesg.JoiningDateforRuleDesg
END
END
END
--******************
ELSE
(Select min(Joining_Date) from HRMS_Employee_ServiceRecord (nolock)
where fk_Designation_ID in (SELECT * from dbo.Split('''+@Designation_Level1+''','',''))
and pk_Employee_ID = SR.pk_Employee_ID)
END as Level_1_Designation
FROM HRMS_EMPLOYEE_SERVICERECORD SR(NOLOCK)
INNER JOIN HRMS_Mst_Employee MstEmp (NOLOCK) ON SR.pk_Employee_ID=MstEmp.pk_Employee_ID AND Sr.IsCurrent_Appointment=''1'' AND Sr.fk_SeparationType_ID is null AND Sr.Is_Approved=''1''
INNER JOIN
(
Select pk_Employee_ID, min(Joining_Date) as JoiningDateforRuleDesg from HRMS_Employee_ServiceRecord (nolock)
where fk_Designation_ID = '+CAST(@pk_Designation_IDForRule as varchar)+'
group by pk_Employee_ID
)TJoiningDateforRuleDesg ON TJoiningDateforRuleDesg.pk_Employee_ID = SR.pk_Employee_ID
LEFT JOIN
(
Select Distinct RuleEQ.pk_Employee_ID as NETSETpk_Employee_ID, min(RuleEQ.Passing_Date) as NETSETPassing_Date
FROM HRMS_Employee_Qualifications RuleEQ
WHERE
fk_Course_ID in (SELECT * from dbo.Split('''+(@NETSETQualification)+''','',''))
group by RuleEQ.pk_Employee_ID
)NETSETQual ON
NETSETQual.NETSETpk_Employee_ID = SR.pk_Employee_ID
LEFT JOIN
(
Select Distinct RuleEQ.pk_Employee_ID as MPHILQualpk_Employee_ID, min(RuleEQ.Passing_Date) as MPHILQualPassing_Date
FROM HRMS_Employee_Qualifications RuleEQ
WHERE
fk_Course_ID in (SELECT * from dbo.Split('''+(@MPHILQualification)+''','',''))
group by RuleEQ.pk_Employee_ID
)MPHILQual ON
MPHILQual.MPHILQualpk_Employee_ID = SR.pk_Employee_ID
LEFT JOIN HRMS_Employee_Qualifications RuleEQ ON RuleEQ.pk_Employee_ID = SR.pk_employee_ID
where
MstEmp.deleted=''0'' and
SR.Appointment_Type in (''3'' , ''2'')
and SR.fk_SeparationType_ID is null and
SR.fk_Designation_ID='+ cast(@pk_Designation_IDForRule as varchar)+' AND
( (TJoiningDateforRuleDesg.JoiningDateforRuleDesg < '+cast(@JoiningDateChkforRule as varchar)+')
OR
(TJoiningDateforRuleDesg.JoiningDateforRuleDesg >= '+cast(@JoiningDateChkforRule as varchar)+' AND RuleEQ.fk_Course_ID IN (SELECT * from dbo.Split('''+@NETSETQualification+''','','')))
OR
(TJoiningDateforRuleDesg.JoiningDateforRuleDesg >= '+cast(@JoiningDateChkforRule as varchar)+' AND RuleEQ.fk_Course_ID IN (SELECT * from dbo.Split('''+@MPHILQualification+''','','')) ) ) '
-- and ES.pk_CourseBranch_ID in (35)
end
set@Sql='SELECT Distinct SR.pk_employee_ID,ISNULL(姓氏,''''.''.+''.'''.+ISNULL(名首,'.''.''.''.+'''.+ISNULL(中间名,'.'')作为Emp名称,Emp_代码,
TJoiningDateforRuleDesg.JoiningDateforRuleDesg,
--如果主标志和规则标志相同
--主要名称
案例'+@pk_Designation_ID+'
当“+cast”(@pk_Designation_IDForRule as varchar)+”时,则
--******************
DATEDIFF(DAY,TJoiningDateforRuleDesg.JoiningDateforRuleDesg,“+cast(@JoiningDateChkforRule as varchar)+”)大于0时的大小写
然后TJoiningDateforRuleDesg.JoiningDateforRuleDesg
其他的
DATEDIFF(day,isnull(NETSETQual.NETSETPassing_Date,mphillqual.mphillqualpassing_Date),isnull(mphillqual.mphillqualpassing_Date,NETSETQual.NETSETPassing_Date))大于等于0时的情况
然后
如果DATEDIFF(day,NETSETQual.NETSETPassing_Date,TJoiningDateforRuleDesg.JoiningDateforRuleDesg)否,则不能将其放入变量中,除非全面使用动态SQL
根据代码的实际外观,您可以使用视图(或函数)或CTE来封装其中的一部分
我宁愿坚持写五遍,并期待更好的表现。。。。如果我使用的是动态sql,我可以这样做吗?告诉我们到目前为止你有什么。我已经更新了相同的代码,你可以看到--******块之间的部分,正在重复,它将重复到4级