簡體   English   中英

SQL Server檢查數據庫視圖中的所有列是否有特定的字符串值

[英]SQL Server to check all columns in a databases views for a specific string value

我的雇主有一個第三方應用程序,該應用程序具有一組非常復雜的傾斜命名視圖。 我正在嘗試查找包含在應用程序UI中輸入的特定數據的視圖。

我有使用所有視圖名稱和列名稱構建CTE的SQL ...

我無法弄清楚的是如何在每個視圖中測試特定列值的每個列(可能包含一個字符串值)。

這是我所做的開始,雖然沒有用,但是可以說明我正在嘗試做的事情。 請注意,它也缺少根據要保存字符串值的列進行檢查的約束。

下面的另一個明顯的問題是我想評估列的值,而不是值的列名。

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類型的任何列,則該列包含所搜索的值(不區分大小寫)。 如果要包括從字符串類型派生的任何自定義類型,則必須進行相應的調整。

輸出是匹配的模式,表(或視圖)名稱,列名稱和值(如果多行在該列中包含搜索值,則一列可能會列出多次)。

(免責聲明:可能還有改進或錯誤的余地。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM