【问题标题】:How to convert this Oracle stored procedure into a SQL Server stored procedure?如何将此 Oracle 存储过程转换为 SQL Server 存储过程?
【发布时间】:2020-10-12 13:38:51
【问题描述】:

我有一个下面提到的 Oracle 存储过程,它获取逗号分隔的字符串参数作为输入,通过循环将其拆分并返回从拆分 csv 获得的 id 的路径。如何在 SQL Server 中创建与此类似的过程?

create or replace PROCEDURE FILE_LOOP(V_FID IN varchar2,
                                      V_NAME OUT VARCHAR2) IS
BEGIN
  FOR ITEM IN (SELECT  V.PATHH||'\'|| V.NAME AS PATH 
               FROM  FILES T INNER JOIN 
                     Table2 V ON T.FOLID=V.ID 
               WHERE T.ID IN (SELECT TRIM(REGEXP_SUBSTR(V_FID,'[^,]+', 1, LEVEL))
                              FROM DUAL
                              CONNECT BY LEVEL <= 1+ REGEXP_COUNT(V_FID , ',')))
  LOOP
     v_name:=v_name||item.PATH;
  END LOOP;

END;

请帮我写一个在sql server中给出完全相同输出的程序?我是 sql server 的新手。

【问题讨论】:

    标签: oracle loops stored-procedures sql-server-2017


    【解决方案1】:

    我想这就是你想要的:

    if object_id('FILE_LOOP', 'P') is not null
      drop procedure FILE_LOOP;
    go
    
    create PROCEDURE 
      FILE_LOOP(
      @V_FID varchar(4000),
      @V_NAME VARCHAR(4000) OUT) AS
      BEGIN
      SET NOCOUNT ON;
       DECLARE ITEM CURSOR FOR
       SELECT 
       ISNULL(V.PATHH, '') + '' +
       ISNULL(V.NAME, '') AS PATH 
       FROM 
       FILES T 
       INNER JOIN Table2 V ON T.FOLID=V.ID 
       WHERE T.ID IN( SELECT 
          RTRIM(LTRIM(REGEXP_SUBSTR(@V_FID ,'[^,]+', 1, LEVEL));
          FROM DUAL 
          CONNECT BY LEVEL <= 1 + REGEXP_COUNT(@V_FID ,',')))
      WHILE 1=1 
      BEGIN
      set @v_name=isnull(@V_NAME, '') + ISNULL(item.PATH, '');
      END;
    
     FETCH ITEM INTO;
     END;
     CLOSE ITEM;
     DEALLOCATE ITEM;
    

    【讨论】:

    • REGEXP_SUBSTR 在 SQL Server 中不可用。是否有任何替代方法可以拆分字符串并一次只考虑一个值?
    • 同样,DUAL 是 Oracle 特有的。虽然 Seeker 可以轻松地在 SQL Server 中创建自己的 DUAL 表,但它不会是惯用的 T-SQL。
    • SQL Server 中同样没有 CONNECT BY LEVEL。和 REGEXP_COUNT ???循环“WHILE 1=1 ...”对我来说看起来很奇怪...
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2015-07-05
    • 2020-06-06
    • 2011-02-15
    相关资源
    最近更新 更多