sql – 查找值并显示找到的值的数据库,表,列,主键

前端之家收集整理的这篇文章主要介绍了sql – 查找值并显示找到的值的数据库,表,列,主键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑有一个名为:People的表
  1. | Id | Name | Code |
  2. | 1 | John | 857 |
  3. | 2 | Mike | 893 |
  4. | 3 | Sara | 935 |

此表位于PeopleDb表中.

问题是 :

我想找到’Mike’关键字.
情况:
我不知道要搜索哪个数据库,表.

我需要一个搜索所有数据库和表的T-SQL查询并向我显示

  1. | Id | DatabaseName | TableName | ColumnName | Pk | SearchValue
  2. | 1 | 'PeopleDb' | 'People' | 'Name' | 2 | 'Mike'

我不知道如何编写查询以在所有数据库和表中进行搜索.

任何帮助将不胜感激.

编辑:

速度不是问题,我需要这样做.

我尝试了这个查询,我想要相同但搜索所有数据库.

  1. CREATE PROC SearchAllTables
  2. (
  3. @SearchStr nvarchar(100)
  4. )
  5. AS
  6. BEGIN
  7.  
  8. -- Copyright © 2002 Narayana Vyas Kondreddi.All rights reserved.
  9. -- Purpose: To search all columns of all tables for a given search string
  10. -- Written by: Narayana Vyas Kondreddi
  11. -- Site: http://vyaskn.tripod.com
  12. -- Tested on: sql Server 7.0 and sql Server 2000
  13. -- Date modified: 28th July 2002 22:50 GMT
  14.  
  15. DECLARE @Results TABLE(ColumnName nvarchar(370),ColumnValue nvarchar(3630))
  16.  
  17. SET NOCOUNT ON
  18.  
  19. DECLARE @TableName nvarchar(256),@ColumnName nvarchar(128),@SearchStr2 nvarchar(110)
  20. SET @TableName = ''
  21. SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
  22.  
  23. WHILE @TableName IS NOT NULL
  24. BEGIN
  25. SET @ColumnName = ''
  26. SET @TableName =
  27. (
  28. SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
  29. FROM INFORMATION_SCHEMA.TABLES
  30. WHERE TABLE_TYPE = 'BASE TABLE'
  31. AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
  32. AND OBJECTPROPERTY(
  33. OBJECT_ID(
  34. QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
  35. ),'IsMSShipped'
  36. ) = 0
  37. )
  38.  
  39. WHILE(@TableName IS NOT NULL) AND(@ColumnName IS NOT NULL)
  40. BEGIN
  41. SET @ColumnName =
  42. (
  43. SELECT MIN(QUOTENAME(COLUMN_NAME))
  44. FROM INFORMATION_SCHEMA.COLUMNS
  45. WHERE TABLE_SCHEMA = PARSENAME(@TableName,2)
  46. AND TABLE_NAME = PARSENAME(@TableName,1)
  47. AND DATA_TYPE IN ('char','varchar','nchar','nvarchar')
  48. AND QUOTENAME(COLUMN_NAME) > @ColumnName
  49. )
  50.  
  51. IF @ColumnName IS NOT NULL
  52. BEGIN
  53. INSERT INTO @Results
  54. EXEC
  55. (
  56. 'SELECT ''' + @TableName + '.' + @ColumnName + ''',LEFT(' + @ColumnName + ',3630)
  57. FROM ' + @TableName + ' (NOLOCK) ' +
  58. ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
  59. )
  60. END
  61. END
  62. END
  63.  
  64. SELECT ColumnName,ColumnValue FROM @Results
  65. END

更新:

我需要一个工作的T-sql搜索所有数据库,表,列,所有类型的变量.
当前的答案在nvarchar字段中的连接字符串等某些情况下不起作用.

解决方法

我已根据下面更新了您的逻辑,它工作正常,请看看:
  1. DECLARE @SearchStr VARCHAR(50)='Surat'
  2.  
  3. DECLARE @Results TABLE(DatabaseName NVARCHAR(500),TableName nvarchar(370),ColumnName nvarchar(370),ColumnValue nvarchar(3630),PrimaryKey nvarchar(200),PrimaryKeyValue nvarchar(4000))
  4.  
  5. SET NOCOUNT ON
  6.  
  7. DECLARE @TableList AS Table
  8. (
  9. TableName VARCHAR(500),RowNo INT
  10. )
  11.  
  12. DECLARE @ColumnList AS Table
  13. (
  14. ColumnName VARCHAR(500),RowNo INT
  15. )
  16.  
  17. DECLARE @PrimaryKeyList AS Table
  18. (
  19. PrimaryKeyName VARCHAR(500)
  20. )
  21.  
  22. DECLARE @TableName nvarchar(256),@SearchStr2 nvarchar(110),@PrimaryKey nvarchar(200),@CurrentTableName nvarchar(256)
  23. SET @TableName = ''
  24. SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
  25.  
  26. DECLARE @DatabaseCount INT=0,@Index INT=0,@DatabaseName NVARCHAR(500),@TotalColumnCount INT,@ColumnIndex INT=0,@TotalTableCount INT,@TableIndex INT=0
  27.  
  28. SELECT
  29. *,ROW_NUMBER() OVER (ORDER BY name) AS RowNo
  30. INTO #tblDatabases
  31. FROM Sys.Databases
  32. WHERE name NOT IN ('master','model','msdb','tempdb')
  33.  
  34. SELECT @DatabaseCount=COUNT (*) FROM #tblDatabases
  35. WHILE @Index<@DatabaseCount
  36. BEGIN
  37. SET @Index=@Index+1
  38. SELECT @DatabaseName='',@TableIndex=0,@ColumnIndex=0,@TableName='',@ColumnName=''
  39. SELECT @DatabaseName=name FROM #tblDatabases WHERE RowNo=@Index
  40.  
  41. DELETE FROM @TableList
  42. INSERT INTO @TableList
  43. EXEC('
  44. SELECT QUOTENAME(TABLE_SCHEMA) + ''.'' + QUOTENAME(TABLE_NAME),ROW_NUMBER() OVER (ORDER BY TABLE_NAME)
  45. FROM ['+@DatabaseName+'].INFORMATION_SCHEMA.TABLES
  46. WHERE TABLE_TYPE = ''BASE TABLE''
  47. ')
  48.  
  49. SELECT @TotalTableCount=COUNT(*) FROM @TableList
  50.  
  51. WHILE @TableIndex<@TotalTableCount
  52. BEGIN
  53.  
  54. SET @TableIndex=@TableIndex+1
  55. SELECT @ColumnName = '',@ColumnIndex=0
  56.  
  57. SELECT @TableName=TableName FROM @TableList WHERE RowNo=@TableIndex
  58. SET @CurrentTableName=REPLACE(REPLACE(REPLACE(@TableName,'[dbo].',''),'[',']','')
  59.  
  60. DELETE FROM @ColumnList
  61. INSERT INTO @ColumnList
  62. EXEC('SELECT
  63. COLUMN_NAME,ROW_NUMBER() OVER (ORDER BY COLUMN_NAME)
  64. FROM ['+@DatabaseName+'].INFORMATION_SCHEMA.COLUMNS
  65. WHERE TABLE_SCHEMA = PARSENAME('''+@TableName+''',2)
  66. AND TABLE_NAME = PARSENAME('''+@TableName+''',1)
  67. AND DATA_TYPE IN (''char'',''varchar'',''nchar'',''nvarchar'')
  68.  
  69.  
  70. ')
  71.  
  72. SELECT @TotalColumnCount=COUNT(*) FROM @ColumnList
  73.  
  74. WHILE @ColumnIndex<@TotalColumnCount
  75. BEGIN
  76. SET @ColumnIndex=@ColumnIndex+1
  77. SET @ColumnName=''
  78. SELECT @ColumnName=ColumnName FROM @ColumnList WHERE RowNo=@ColumnIndex
  79.  
  80. DELETE FROM @PrimaryKeyList
  81. INSERT INTO @PrimaryKeyList
  82. EXEC('
  83. SELECT Col.Column_Name from
  84. ['+@DatabaseName+'].INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab,['+@DatabaseName+'].INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col
  85. WHERE
  86. Col.Constraint_Name = Tab.Constraint_Name
  87. AND Col.Table_Name = Tab.Table_Name
  88. AND Constraint_Type = ''PRIMARY KEY''
  89. AND Col.Table_Name= '''+@CurrentTableName+'''
  90. ')
  91.  
  92. SELECT @PrimaryKey=''
  93. SELECT @PrimaryKey=PrimaryKeyName FROM @PrimaryKeyList
  94. SET @PrimaryKey=ISNULL(@PrimaryKey,'')
  95.  
  96. IF @ColumnName IS NOT NULL AND @PrimaryKey<>''
  97. BEGIN
  98. INSERT INTO @Results
  99. EXEC
  100. (
  101. 'SELECT '''+@DatabaseName+''','''+@CurrentTableName+''',''' + @ColumnName + ''',3630),'''+@PrimaryKey+''',[' + @PrimaryKey + ']
  102. FROM ['+@DatabaseName+'].' + @TableName + ' (NOLOCK) ' +
  103. ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
  104. )
  105. END
  106. END
  107. END
  108. END
  109.  
  110.  
  111. SELECT ROW_NUMBER() OVER (ORDER BY DatabaseName) AS Id,DatabaseName,TableName,ColumnName,ColumnValue AS SearchValue,PrimaryKeyValue AS Pk,PrimaryKey FROM @Results
  112.  
  113. DROP TABLE #tblDatabases

猜你在找的MsSQL相关文章