SQL 带有 IN 或 LIKE 子查询的查询

SQL query with sub query with IN or LIKE

我有一个 table,其中有 50 行是复制文章。我需要选择这些名称并查询 sys.sql_modules 以查看文章名称是否存在于定义(proc 文本)中的任何位置。我已经根据此处另一个线程的类似建议尝试了以下操作,但它报告了我不期望的所有行;

SELECT Article,
       CASE WHEN exists (SELECT OBJECT_NAME(object_id) AS name,
                                definition
                         FROM sys.sql_modules
                         WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
                           AND definition LIKE '%database%') 
              THEN 'YES else'
           ELSE article
       END
FROM dbo.Article 

也许我需要尝试反过来查询?所以用所有存储过程的语法填充临时 table,然后根据它查询文章名称?

您的子查询未链接到查询,我认为这就是您所说的 "exist anywhere"。

在下面的代码中,它只搜索对象定义中的文章名称。使用 CHARINDEX 而不是 LIKE 来搜索定义中是否存在文章。

SELECT Article,
       CASE WHEN exists (SELECT OBJECT_NAME(object_id) AS name,
                                definition
                         FROM sys.sql_modules
                         WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
                           AND  CHARINDEX(article, definition) > 0) 
              THEN 'YES else'
           ELSE article
       END
FROM dbo.Article 

您的文章与模块之间没有任何关系。我猜您想在 definition 中找到 Article,这表明逻辑如下:

SELECT a.Article, m.definition
FROM dbo.Article a JOIN
     sys.sql_modules m
     ON OBJECTPROPERTY(m.object_id, 'IsProcedure') = 1 AND
        m.definition LIKE '%database%' AND
        m.definition LIKE '%' + a.Article_Name + '%'

我不知道 "database" 上的条件是否需要,但它是你原来问题的一部分。