Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我想将这4个存储过程合并为一个,因为它们都返回相同的数据(几乎)_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 我想将这4个存储过程合并为一个,因为它们都返回相同的数据(几乎)

Sql 我想将这4个存储过程合并为一个,因为它们都返回相同的数据(几乎),sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,下面是我的存储过程。我想将所有这些合并到一个存储过程中,以减少冗余。任何帮助都将不胜感激。谢谢 存储过程1: ALTER PROCEDURE [dbo].[SP_FetchSkillBlockToAddPR] AS SELECT sb.skillblockid ,sb.skillblockcd FROM skillblock AS sb ,skillfamily ,lineofbusiness AS lb WHERE skillfamily.skillfamilyid = sb

下面是我的存储过程。我想将所有这些合并到一个存储过程中,以减少冗余。任何帮助都将不胜感激。谢谢

存储过程1:

ALTER PROCEDURE [dbo].[SP_FetchSkillBlockToAddPR]
AS
SELECT
  sb.skillblockid
 ,sb.skillblockcd
FROM
  skillblock AS sb
 ,skillfamily
 ,lineofbusiness AS lb
WHERE
  skillfamily.skillfamilyid = sb.skillfamilyid
  AND lb.lineofbusinessid = skillfamily.lineofbusinessid
  AND lb.lineofbusinesscode IN
        ( 'PL' )
  AND sb.activeflag = 'Y'
ORDER BY
  sb.skillblockcd;
存储过程2:

ALTER PROCEDURE [dbo].[SP_FetchSkillBlockToUpdateTeamData]
AS
SELECT
  SkillBlock.SkillBlockId
 ,SkillBlock.SkillBlockCd
 ,SkillBlock.SkillBlockName
FROM
  SkillBlock
  INNER JOIN
    SkillFamily
      ON
      SkillFamily.SkillFamilyId = SkillBlock.SkillFamilyId
WHERE
  SkillFamily.LineOfBusinessId = 27
  AND SkillBlock.ActiveFlag = 'Y'
  AND SkillFamily.ActiveFlag = 'Y';
存储过程3:

ALTER PROCEDURE [dbo].[SP_FetchSkillBlockBySkillBlockCd]
AS
SELECT
  skillblockid
 ,SkillblockCd
FROM
  skillblock
 ,skillfamily
WHERE
  skillblock.skillfamilyid = skillfamily.skillfamilyid
  AND lineofbusinessid = 27
ORDER BY
  Skillblockcd;
存储过程4:

ALTER PROCEDURE [dbo].[SP_FetchSkillBlock]
AS
SELECT
  sb.skillblockid
 ,sb.skillblockcd
FROM
  skillblock AS sb
 ,skillfamily AS sf
 ,lineofbusiness AS lb
WHERE
  sf.skillfamilyid = sb.skillfamilyid
  AND lb.lineofbusinessid = sf.lineofbusinessid
  AND lb.lineofbusinesscode IN ( 'PL' );

我会开始使用显式连接

话虽如此,您的要求非常广泛。但是,组合那些从不同表中提取并返回具有不同谓词的不同列的最简单方法是:

create myLargerProc(@choice int)
as

if @choice = 1
begin
--code from first proc
end

if @choice = 2
begin
--code from second proc
end

--etc....
您可以将参数设置为varchar,并获取用户输入或任何您想要的内容。

已解决:将上述所有存储过程组合成一个这样的存储过程,以便可以从多个代码块中调用相同的内容

ALTER PROCEDURE [dbo].[SP_FetchSkillBlock]

@p_ActiveFlagSB char(1) = NULL,
@p_ActiveFlagSF char(1) = NULL

AS

select sb.skillblockid, sb.skillblockcd 
from skillblock as sb, skillfamily as sf, lineofbusiness as lb 
where sf.skillfamilyid=sb.skillfamilyid AND         
lb.lineofbusinessid=sf.lineofbusinessid AND lb.lineofbusinesscode in ('PL') 
AND ((@p_ActiveFlagSB IS NULL) OR (sb.ActiveFlag = @p_ActiveFlagSB))
AND ((@p_ActiveFlagSF IS NULL) OR (sf.ActiveFlag = @p_ActiveFlagSF))
order by sb.SkillBlockCd

请不要丢弃代码,告诉SO志愿者社区检查您的代码,并期待解决方案。它们有什么不同,您做了哪些腿部工作,我们可以帮助解决哪些具体问题?这些存储过程的名称是什么?为什么不在1存储过程中使用参数来返回所需的内容呢?您可以创建一个SP来封装所有三条语句,并具有一个输入参数,该参数接受可以在调用过程中传递的字符串。i、 e AddPR如果要运行第一个查询等..旁注:存储过程不应使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!解决了。谢谢大家的帮助。我会记住的@marc_解决了它。见上文。感谢您的建议@scsimonProc 2返回3列。。。但你的解决方案并不正确。很抱歉我没看到。实际上我不需要第三栏@scsimonWell还有一些过程只查询两个表,其中另一个表使用内部联接,这将改变结果。因此,该解决方案不能带来与单独价格相同的结果,或者不能保证至少达到eah。你是对的,西蒙。但是,我已经根据需要更改了存储过程,并且得到了所需的结果。谢谢