1

我的雇主有一个第三方应用程序,它有一组非常复杂的斜命名视图。我正在尝试查找包含在应用程序 UI 中输入的特定数据的视图。

我有 SQL 来构建一个包含所有视图名称和列名称的 CTE ...

我想不通的是如何在每个视图中测试每个列(可以保存一个字符串值)以获取特定的字符串值。

这是我所做的开始,它不起作用,但会说明我正在尝试做的事情。请注意,它还缺少对要根据可以保存字符串值的内容进行检查的列的约束。

下面的另一个明显问题是我想评估列的值而不是值的列名。

WITH ViewColumn_CTE (ViewName, ColumnName) AS
(
    SELECT TOP 100
        V.Name as ViewName, 
        C.Name as ColumnName
    FROM
        sys.views V 
    JOIN
        SysColumns C ON V.Object_ID = C.ID
)
SELECT TOP 1
    ViewName,
    ColumnName
FROM
    ViewColumn_CTE
WHERE
    ColumnName = 'Cash Equivalents'
4

1 回答 1

1

我有一个这样的脚本在这里飞来飞去。您可以使用它作为开始。

它从目录中获取感兴趣的列的列表,对它们进行迭代并使用动态 SQL 查询它们。

DECLARE @searched_value nvarchar(MAX) = 'a'; -- set to the value you search for

SET NOCOUNT ON;

DECLARE @schema_name sysname;
DECLARE @table_name sysname;
DECLARE @column_name sysname;
DECLARE @sql nvarchar(MAX);
DECLARE @result TABLE ([schema_name] sysname,
                       [table_name] sysname,
                       [column_name] sysname,
                       [value] nvarchar(MAX));

DECLARE cursor_all_columns CURSOR
                           LOCAL
                           FAST_FORWARD
FOR
SELECT s.name,
       o.name,
       c.name
       FROM sys.schemas s
            INNER JOIN sys.all_objects o
                       ON o.schema_id = s.schema_id
            INNER JOIN sys.all_columns c
                       ON c.object_id = o.object_id
            INNER JOIN sys.types y
                       ON y.user_type_id = c.user_type_id
       WHERE o.type = 'U' -- set to 'V' for views
             AND lower(y.name) IN ('char',
                                   'nchar',
                                   'varchar',
                                   'nvarchar'); -- include more types if needed

OPEN cursor_all_columns;
FETCH NEXT FROM cursor_all_columns
           INTO @schema_name,
                @table_name,
                @column_name;
WHILE @@fetch_status = 0
BEGIN
  SET @sql =   N'SELECT ''' + quotename(@schema_name) + N''',' + nchar(13) + nchar(10)
             + N'       ''' + quotename(@table_name) + N''',' + nchar(13) + nchar(10)
             + N'       ''' + quotename(@column_name) + N''',' + nchar(13) + nchar(10)
             + N'       ' + quotename(@column_name) + N'' + nchar(13) + nchar(10)
             + N'       FROM ' + quotename(@schema_name) + N'.' + quotename(@table_name) + N'' + nchar(13) + nchar(10)
             + N'       WHERE lower(' + quotename(@column_name) + N') LIKE N''%' + lower(replace(replace(replace(@searched_value, '%', '!%'), '[', '!['), ']', '!]')) + N'%'' ESCAPE ''!'';' + nchar(13) + nchar(10);

  INSERT INTO @result
              EXEC sp_executesql @sql;

  FETCH NEXT FROM cursor_all_columns
             INTO @schema_name,
                  @table_name,
                  @column_name;
END;
CLOSE cursor_all_columns;
DEALLOCATE cursor_all_columns;

SELECT [schema_name],
       [table_name],
       [column_name],
       [value]
       FROM @result;

Is 适用于表格,但如果您将对象类型从 更改为 ,它也应该适用于'U'视图'V'。(尽管表格可能更有趣。)但不能保证。

设置您在开始时搜索的值。

如果它包含搜索的值,它会搜索该类型的任何列(n)(var)char,不区分大小写。如果您想要包含从字符串类型派生的任何自定义类型,则必须相应地对其进行调整。

输出是模式、表(或视图)名称、列名称和匹配的值(如果多行包含该列中的搜索值,则该列可能会被列出多次)。

(免责声明:可能有改进的空间或错误。)

于 2019-01-17T21:31:08.770 回答