SQL Server 检查数据库视图中的所有列是不是有特定的字符串值
Posted
技术标签:
【中文标题】SQL Server 检查数据库视图中的所有列是不是有特定的字符串值【英文标题】:SQL Server to check all columns in a databases views for a specific string valueSQL Server 检查数据库视图中的所有列是否有特定的字符串值 【发布时间】:2019-01-17 18:31:45 【问题描述】:我的雇主有一个第三方应用程序,其中包含一组非常复杂的斜命名视图。我正在尝试查找包含在应用程序 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'
【问题讨论】:
CTE 中的视图定义在哪里?大多数(如果不是全部)数据库系统在其系统表中的某处为您提供定义,但您必须阅读文档或咨询您的 DBA 这些名称是什么。还请edit您的帖子并添加您正在使用的 SQL Server 产品作为标签。 我编辑了标签以包含 SQL Server 2014。Sys.views 仅返回视图名称,我在那里看不到任何有用的定义信息。 SysColumns 似乎有数据类型信息,但它并没有跳出来。当我从中选择 * 时,我可以看到字段长度、可空性等。 这是个坏主意,因为 N 个视图可以引用一个实际存储数据的表。视图只是由查询定义的虚拟表。您应该关心的是数据存储在哪些 tables 中。从中可以找到 views 引用这些 tables 如果您真的关心.无论如何,搜索具有varchar
值的每个表(或视图)的每一行听起来很可怕。更好的是使用 SQL Profiler 或其他工具来跟踪用户输入数据时正在调用的查询。然后,你就会知道这些表了。
【参考方案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
类型的任何列,如果它包含搜索的值,不区分大小写。如果您想要包含从字符串类型派生的任何自定义类型,则必须相应地对其进行调整。
输出是架构、表(或视图)名称、列名和匹配的值(如果多行包含该列中的搜索值,则该列可能会被多次列出)。
(免责声明:可能有改进或错误的空间。)
【讨论】:
以上是关于SQL Server 检查数据库视图中的所有列是不是有特定的字符串值的主要内容,如果未能解决你的问题,请参考以下文章
我如何使用java检查sql server中的数据库名称是不是已经存在? [复制]
我们 MSAccess 是不是可以通过 SQL Server 中的外部链接视图插入数据? [复制]
SQL server - 在创建之前检查 SP 中的对象是不是存在