Sql 循环遍历所有数据以搜索特定字符串
我想循环遍历数据库中所有可用表的所有列,以检查哪一列包含字符串“Kroki Homes”Sql 循环遍历所有数据以搜索特定字符串,sql,sql-server,Sql,Sql Server,我想循环遍历数据库中所有可用表的所有列,以检查哪一列包含字符串“Kroki Homes” 我的数据库中大约有56个表。因此,很难将这56个表的所有列都签入。在sql server中有什么简单的方法可以实现这一点吗?您可以创建一个过程,并可以传递字符串进行搜索。我找到了一些可能对你有帮助的地方 CREATE PROC [dbo].[SearchDataFromAllTables] (@SearchStr NVARCHAR(100)) AS BEGIN SET NOCOUNT ON;
我的数据库中大约有56个表。因此,很难将这56个表的所有列都签入。在sql server中有什么简单的方法可以实现这一点吗?您可以创建一个过程,并可以传递字符串进行搜索。我找到了一些可能对你有帮助的地方
CREATE PROC [dbo].[SearchDataFromAllTables] (@SearchStr NVARCHAR(100))
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #Results
(
ColumnName NVARCHAR(370),
ColumnValue NVARCHAR(3630)
)
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
您需要编写一个存储过程来扫描所有表 下面的脚本提供给表和列。由此,您应该在运行中创建一个SQL,并动态执行以从表中进行选择。如果您需要更多详细信息,请告诉我们
SELECT tb.name AS table_name,
c.name AS column_name,
c.column_id,
tp.name AS column_data_type,
c.max_length,
c.precision,
c.scale,
CASE c.is_nullable WHEN 1 THEN 'YES' ELSE 'NO' END AS is_nullable
FROM sys.tables tb,
sys.columns c,
sys.types tp
WHERE tb.object_id = c.object_id
AND SCHEMA_NAME(tb.schema_id) = 'dbo'
AND c.user_type_id = tp.user_type_id
ORDER BY table_name, column_id;
谢谢它会在56个表的所有列中搜索吗?会。它会:)你可以试试看谢谢拉梅什。在上面的回答中,我看到使用了信息性的schema.tables,在您的回答中,我看到了sys.tables。这两者之间有什么区别吗?信息模式是不完整的,并不总是可靠的,但是它在ANSI标准中更便于移植。这真的取决于你认为什么是两个邪恶中的较小者。参考这个链接