gpt4 book ai didi

sql - 如何使用 T-SQL 在数据库中的所有文本字段中搜索某些子字符串

转载 作者:行者123 更新时间:2023-12-02 07:21:21 26 4
gpt4 key购买 nike

我有一个巨大的架构,有数百个表和数千个列。我知道特定的 IP 地址存储在该数据库的多个位置,但我不确定它存储在哪个表或列中。基本上,我试图找到该地址的所有位置IP 地址存储在数据库中,因此我可以在所有这些位置将其更新为新值。

这是我对 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'

等等

最佳答案

你已经很接近了。将您的与以下示例进行比较:Searching and finding a string value in all columns in a SQL Server table

上面的链接用于搜索单个表,但是这里是另一个包含所有表的链接:How to search all columns of all tables in a database for a keyword?

编辑:以防万一链接变坏,这是该链接的解决方案...

CREATE PROC SearchAllTables
(
@SearchStr nvarchar(100)
)
AS
BEGIN

-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 28th July 2002 22:50 GMT


CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

SET NOCOUNT ON

DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)

WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)

IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END

SELECT ColumnName, ColumnValue FROM #Results
END


EXEC SearchAllTables '<yourSubstringHere>'

注意:正如代码片段中的注释所示,它是使用旧版本的 SQL Server 进行测试的。这可能不适用于 SQL Server 2012。

关于sql - 如何使用 T-SQL 在数据库中的所有文本字段中搜索某些子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12824577/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com