Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server检查数据库视图中的所有列是否具有特定的字符串值_Sql_Sql Server_Sql Server 2014_Common Table Expression_System Tables - Fatal编程技术网

SQL Server检查数据库视图中的所有列是否具有特定的字符串值

SQL Server检查数据库视图中的所有列是否具有特定的字符串值,sql,sql-server,sql-server-2014,common-table-expression,system-tables,Sql,Sql Server,Sql Server 2014,Common Table Expression,System Tables,我的雇主有一个第三方应用程序,它有一组非常复杂的间接命名视图。我试图找到包含在应用程序UI中输入的特定数据的视图 我有SQL来构建一个包含所有视图名和列名的CTE 我搞不懂的是如何在每个视图中测试每个列(可能包含一个字符串值)的特定字符串值 这是我做的一个开始,它不起作用,但将说明我正在尝试做什么。请注意,它还缺少一个列上的约束,以根据可以容纳字符串值的内容进行检查 下面的另一个明显的问题是,我想计算列的值,而不是值的列名 WITH ViewColumn_CTE (ViewName, Colum

我的雇主有一个第三方应用程序,它有一组非常复杂的间接命名视图。我试图找到包含在应用程序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'

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

它从目录中获取感兴趣的列的列表,并使用动态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;
是用于表,但如果将对象类型从
'U'
更改为
'V'
,则它也适用于视图。(尽管这些表格可能更有趣。)但不能保证

设置开始时搜索的值

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

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


(免责声明:可能有改进或缺陷的余地。)

您的CTE中的视图定义在哪里?大多数(如果不是全部的话)数据库系统在其系统表的某个地方为您提供了定义,但您必须阅读文档或向DBA咨询这些定义的名称。还请发布并添加您正在用作标记的SQL server产品。我编辑了这些标记以包括SQL server 2014。Sys.views只是返回视图名称,我在那里没有看到任何有用的定义信息。SysColumns似乎有数据类型信息,但它并没有向我跳出来。我可以看到字段长度、可空性等。。。当我从中选择*时,这是个坏主意,因为N个视图可以引用实际存储数据的单个表。视图只是由查询定义的虚拟表。您应该关心的是数据存储在哪些表中。从中,您可以找到哪些视图引用了这些表(如果您真正关心的话)。无论如何,在每一行中搜索具有
varchar
值的每个表(或视图)听起来很可怕。更好的方法是使用SQL Profiler或其他工具跟踪用户输入数据时调用的查询。那你就知道这些桌子了。