当前位置: 首页 > 面试题库 >

T-SQL Puzzler-爬行对象依赖项

梅安平
2023-03-14
问题内容

此代码涉及一个递归存储过程调用和一种避免游标名称冲突的“不太好”的方法。最后,我不在乎它是否使用游标。只是在寻找最优雅的方法。我主要将其用作跟踪Stored
Proc层次结构的简单方法(无需购买产品)。我在“动态sql”中尝试了游标,但运气不佳。我想深入十个层次。

所需的输出:

sp_Master_Proc_Name  
-sp_Child_Proc_1_Name  
---- sp_Sub_Proc_1_Name    
-sp_Child_Proc_2_Name  
-sp_Child_Proc_3_Name

它不是很漂亮,但是这里是代码(它没有按预期工作)

    CREATE PROCEDURE SP_GET_DEPENDENCIES
    (
      @obj_name varchar(300),
      @level int
    )
    AS
    DECLARE @sub_obj_name varchar(300)
    IF @level = 1
      BEGIN
        PRINT @obj_name
      END

    IF @level = 1
      BEGIN 
        DECLARE the_cursor_1 CURSOR FOR 
            SELECT DISTINCT REPLICATE('--', @level) + ' ' + c.name FROM dbo.sysdepends a
              INNER JOIN dbo.sysobjects b ON a.id = b.id
              INNER JOIN dbo.sysobjects c ON a.depid = c.id
              WHERE b.name = @obj_name
        OPEN the_cursor_1
        SET @level = @level + 1
        FETCH NEXT FROM the_cursor_1 INTO @sub_obj_name 
        WHILE @@FETCH_STATUS = 0 
          BEGIN 
            PRINT @sub_obj_name
            EXEC SP_GET_DEPENDENCIES @sub_obj_name, @level 
            FETCH NEXT FROM the_cursor_1 INTO @sub_obj_name 
          END
        CLOSE the_cursor_1
        DEALLOCATE the_cursor_1
      END

    IF @level = 2
      BEGIN 
        DECLARE the_cursor_2 CURSOR FOR 
            SELECT DISTINCT REPLICATE('--', @level) + ' ' + c.name FROM dbo.sysdepends a
              INNER JOIN dbo.sysobjects b ON a.id = b.id
              INNER JOIN dbo.sysobjects c ON a.depid = c.id
              WHERE b.name = @obj_name
        OPEN the_cursor_2
        SET @level = @level + 1
        FETCH NEXT FROM the_cursor_2 INTO @sub_obj_name 
        WHILE @@FETCH_STATUS = 0 
          BEGIN 
            PRINT @sub_obj_name
            EXEC SP_GET_DEPENDENCIES @sub_obj_name, @level 
            FETCH NEXT FROM the_cursor_2 INTO @sub_obj_name 
          END
        CLOSE the_cursor_2
        DEALLOCATE the_cursor_2
      END

    IF @level = 3
      BEGIN 
        DECLARE the_cursor_3 CURSOR FOR 
            SELECT DISTINCT REPLICATE('--', @level) + ' ' + c.name FROM dbo.sysdepends a
              INNER JOIN dbo.sysobjects b ON a.id = b.id
              INNER JOIN dbo.sysobjects c ON a.depid = c.id
              WHERE b.name = @obj_name
        OPEN the_cursor_3
        SET @level = @level + 1
        FETCH NEXT FROM the_cursor_3 INTO @sub_obj_name 
        WHILE @@FETCH_STATUS = 0 
          BEGIN 
            PRINT @sub_obj_name
            EXEC SP_GET_DEPENDENCIES @sub_obj_name, @level 
            FETCH NEXT FROM the_cursor_3 INTO @sub_obj_name 
          END
        CLOSE the_cursor_3
        DEALLOCATE the_cursor_3
      END

问题答案:

对于ms sql服务器,您可以使用CURSOR LOCAL,然后游标位于sproc调用的本地,您的代码将变得更加简单:

CREATE PROCEDURE uspPrintDependencies
(
    @obj_name varchar(300),
    @level int
)
AS
SET NOCOUNT ON
DECLARE @sub_obj_name varchar(300)

if @level > 0 begin
    PRINT Replicate(' ',@level) + @obj_name
end
else begin
    PRINT @obj_name
end

DECLARE myCursor CURSOR LOCAL FOR 
    SELECT 
        DISTINCT c.name 
    FROM dbo.sysdepends a
        INNER JOIN dbo.sysobjects b ON a.id = b.id
        INNER JOIN dbo.sysobjects c ON a.depid = c.id
    WHERE b.name = @obj_name
OPEN myCursor
SET @level = @level + 1
FETCH NEXT FROM myCursor INTO @sub_obj_name 
WHILE @@FETCH_STATUS = 0 BEGIN 
    EXEC uspPrintDependencies @sub_obj_name, @level 
    FETCH NEXT FROM myCursor INTO @sub_obj_name 
END
CLOSE myCursor
DEALLOCATE myCursor
GO


 类似资料:
  • 组 件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合 成概念(而并不是系统构架层次上的组件的概念)。举个例子,你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private

  • 一个爬虫对象下面可能会有多个爬虫项目,他们都是相关联的。 定义示例: 继承Yurun\Crawler\Module\Crawler\Contract\BaseCrawler类,并实现方法。 <?php namespace Yurun\CrawlerApp\Module\YurunBlog; use Imi\Bean\Annotation\Bean; use Imi\Cron\Consts\Cro

  • 我来自Java背景,也是函数范式的新手,所以请原谅我,我身上有OOP的味道。 我有一个特征名称付款处理程序 和 直到这里一切都很好,但是当我想拥有多个基于付款方式的支付网关时,问题就来了。最初我写了一个像 PaymentHandlerFactory 这样的 然后使用这个PaymentHandlerFactory获取guice注入的PayPal对象。但不知怎的,我觉得这不是正确的方法,于是我找到了同

  • 问题内容: 我对Hibernate还是很陌生,一直在尝试确定它将为您做什么以及需要您做什么。 最重要的是处理一个对象,该对象具有数据库中尚不存在的依赖项。例如,我有一个Project对象,其中包含一个Manufacturer字段,该字段接受Manufacturer对象作为其值。在数据库中,我有一个带mfr_id列的产品表,该列是对Manufacturers表的引用(一种相当典型的单向一对多关系)。

  • 问题内容: 我想知道以下两个方法声明之间有什么区别: 有什么可以/可以做的,而不是另一种?我在本网站的其他地方找不到这个问题。 问题答案: 与上下文隔离-没有区别。在和两者上,您只能调用的方法。 但是有上下文-如果您有泛型类: 然后: 与对象相同的代码 两个优点: 无需强制转换(编译器向您隐藏了此内容) 编译有效的时间安全性。如果使用的是版本,则不能确保方法始终返回。如果返回,则在运行时会有一个。

  • npm是否有安装依赖作为对等依赖的选项,如yarn选项,而不是手动添加它例如: 感谢@Broncha,更新问题的更多说明 问题是如何向项目添加对等依赖。那就是 将依赖项添加到package.json中的“dependencies”中, 如何安装将其添加到package.json?中的“对等依赖”的依赖项