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

时间:2015-03-05 13:46:20

标签: sql sql-server tsql

我有一个包含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 

也许我需要尝试以相反的方式查询它?那么使用所有存储过程的语法填充临时表,然后查询文章名称?

2 个答案:

答案 0 :(得分:1)

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

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 + '%'

我不知道是否需要“数据库”的条件,但这是原始问题的一部分。

答案 1 :(得分:0)

你的子查询不是'链接到查询,我认为你的意思是"存在于任何地方"。

在下面的代码中,它仅搜索对象定义中的文章名称。使用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