我有一個龐大的模式,包含數百個表和數千個列。我知道一個特定的IP地址存儲在這個數據庫中的幾個地方,但我不確定它存儲在哪個表或列中。基本上,我試圖在任何地方找到這個IP地址存儲在數據庫中,因此我可以在所有這些地方將其更新爲新值。如何使用T-SQL在數據庫中搜索某個子字符串的所有文本字段
這是我第一次在T-SQL語句中打開表格和列的名稱,以及數據庫中每個包含子字符串10.15.13的文本列的值。
現在,這工作,有點。問題是,當我在Management Studio中執行它時,對sp_executesql的調用實際上會返回每個不返回任何內容的查詢中的所有空結果(即該列沒有該子字符串的任何記錄),並且它會填充結果窗口達到其最大值,然後我實際上並沒有看到是否打印了任何內容。
有沒有更好的方法來寫這個查詢?或者我可以用某種不同的方式運行它,以便它只顯示此子字符串存在的表和列?
DECLARE
@SchemaName VARCHAR(50),
@TableName VARCHAR(50),
@ColumnName VARCHAR(50);
BEGIN
DECLARE textColumns CURSOR FOR
SELECT s.Name, tab.Name, c.Name
FROM Sys.Columns c, Sys.Types t, Sys.Tables tab, Sys.Schemas s
WHERE s.schema_id = tab.schema_id AND tab.object_id = c.object_id AND c.user_type_id = t.user_type_id
AND t.Name in ('TEXT','NTEXT','VARCHAR','CHAR','NVARCHAR','NCHAR');
OPEN textColumns
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX),
@ParamDef NVARCHAR(MAX),
@result NVARCHAR(MAX);
SET @sql = N'SELECT ' + @ColumnName + ' FROM ' + @SchemaName + '.' + @TableName + ' WHERE ' + @ColumnName + ' LIKE ''%10.15.13%''';
SET @ParamDef = N'@resultOut NVARCHAR(MAX) OUTPUT';
EXEC sp_executesql @sql, @ParamDef, @resultOut = @result OUTPUT;
PRINT 'Column = ' + @TableName + '.' + @ColumnName + ', Value = ' + @result;
FETCH NEXT FROM textColumns
INTO @SchemaName, @TableName, @ColumnName
END
CLOSE textColumns;
DEALLOCATE textColumns;
END
我想看到的結果是這樣的地方就說明表/列的子串在發現的,該列中的全部價值......
Column = SomeTable.SomeTextColumn, Value = 'https://10.15.13.210/foo'
Column = SomeTable.SomeOtherColumn, Value = '10.15.13.210'
等。
您的近距離。比較你的這個例子:[在SQL Server表中的所有列中搜索和查找字符串值](http://www.mssqltips.com/sqlservertip/1522/searching-and-finding-a-string-value-in -all-columns-in-a-sql-server-table /) – Jeremy
非常感謝!我其實並沒有使用鏈接中的解決方案,因爲它一次只搜索一個表格,但它有另一個鏈接到搜索數據庫中所有表格的完整解決方案;正是我需要的。 http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm請張貼這個答案,我會標記它是正確的! – Jim
我已經包含了答案以及你所指的後代鏈接。謝謝! – Jeremy