当前位置: 首页 > 面试题库 >

如何在表的所有列中动态查找关键字

严宇
2023-03-14
问题内容

我希望能够在表的所有列中动态查找特定的关键字。该脚本的目的是仅需更改关键字和表名,而无需知道表的所有列是什么。

这意味着以下代码不是令人满意的解决方案:

[…]输入“关键字”(字段1,字段2,字段3,字段4,…)[…]

我能够使用子查询动态检索表的所有列名。但是然后,该子查询中的IN语句返回空结果。

然后,我创建了一个新的子查询,该子查询以逗号分隔的列表格式返回列的列表。但是结果也是空的。

这是到目前为止的脚本:

DECLARE @DATABASE_NAME VARCHAR(128)
DECLARE @SCHEMA_NAME VARCHAR(128)
DECLARE @TABLE_NAME VARCHAR(128)
DECLARE @KEYWORD VARCHAR(128)
DECLARE @QUERY01 VARCHAR(MAX)
DECLARE @QUERY02 VARCHAR(MAX)
DECLARE @SUBQUERY01 VARCHAR(MAX)
DECLARE @SUBQUERY02 VARCHAR(MAX)

SET @DATABASE_NAME = '[xxx]'
SET @SCHEMA_NAME = '[dbo]'
SET @TABLE_NAME = 'tblCustomers'
SET @KEYWORD = 'Jean'

SET @SUBQUERY01 = 'SELECT Name FROM sys.columns WHERE object_id = (SELECT 
object_id FROM sys.tables WHERE name = ''' + @TABLE_NAME + ''')'
SET @SUBQUERY02 = 'SELECT SUBSTRING((SELECT '', '' + Name FROM 
sys.columns WHERE object_id = (SELECT object_id FROM sys.tables WHERE 
name = ''' + @TABLE_NAME + ''') FOR XML PATH('''')), 2, 1000000)'

SET @QUERY01 = 'SELECT * FROM ' + @DATABASE_NAME + '.' + @SCHEMA_NAME + 
'.' + @TABLE_NAME
-- + ' WHERE ''' + @KEYWORD + ''' IN (FirstName, LastName)' -- Works                    
+ ' WHERE ''' + @KEYWORD + ''' IN (' + @SUBQUERY01 + ')'

SET @QUERY02 = 'SELECT * FROM ' + @DATABASE_NAME + '.' + @SCHEMA_NAME + 
'.' + @TABLE_NAME
+ ' WHERE ''' + @KEYWORD + ''' IN (' + @SUBQUERY02 + ')'

EXEC (@SUBQUERY01)  -- OK (List of column names, one per row)
EXEC (@SUBQUERY02)  -- OK (List of column names, comma-separated values)

EXEC (@QUERY01)     -- NOK (Empty result)
EXEC (@QUERY02)     -- NOK (Empty result)

我希望脚本返回其中一列中包含关键字的所有行。例如,以下代码可以正常工作:

SELECT * FROM [xxx].[dbo].tblCustomers
WHERE 'Jean' IN (FirstName, LastName)

问题答案:

这可能是您所追求的。请注意,我将搜索限制为仅查看字符串类型的列,正确引用对象(使用QUOTENAME)并参数化以下语句:

DECLARE @Schema sysname,
        @Table sysname,
        @Keyword varchar(100);

DECLARE @SQL nvarchar(MAX);
SET @Schema = N'dbo';
SET @Table = N'icp_yyclient';
SET @Keyword = 'Smith';

SET @SQL = N'SELECT *' + NCHAR(13) + NCHAR(10) + 
           N'FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + NCHAR(13) + NCHAR(10) + 
           N'WHERE @Keyword IN (' + STUFF((SELECT N',' + QUOTENAME(C.[name])
                                           FROM sys.columns c
                                                JOIN sys.tables t ON c.object_id = t.object_id
                                                JOIN sys.schemas s ON t.schema_id = s.schema_id
                                                JOIN sys.types ct ON c.system_type_id = ct.system_type_id
                                            WHERE t.[name] = @Table
                                              AND s.[name] = @Schema
                                              AND ct.[name] IN (N'varchar',N'char',N'nvarchar',N'nchar',N'sysname')
                                            FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,1,N'') + N');';
PRINT @SQL; --Your best friend

EXEC sp_executesql @SQL, N'@Keyword varchar(100)', @Keyword;


 类似资料:
  • 问题内容: 在MySQL中,如何获取指向特定表的所有外键约束的列表?特定的列?这与该Oracle问题相同,但适用于MySQL。 问题答案: 对于表: 对于列: 基本上,我们在where子句中将REFERENCED_TABLE_NAME更改为REFERENCED_COLUMN_NAME。

  • 问题内容: 我有一本这样的字典: 基本上是一本具有嵌套列表,字典和字符串的字典,其深度是任意的。 遍历此方法以提取每个“ id”键的值的最佳方法是什么?我想实现与“ // id”之类的XPath查询等效的功能。“ id”的值始终是一个字符串。 因此,从我的示例中,我需要的输出基本上是: 顺序并不重要。 问题答案: 我发现此Q / A非常有趣,因为它为同一问题提供了几种不同的解决方案。我采用了所有这

  • 问题内容: 我对Python中的字典有疑问。 这里是: 我有一个像 现在,我想通过相同的值获取所有关键元素,并将其保存在新的字典中。 新的Dict应该如下所示: 问题答案: 如果您对新字典中的列表而不是元组感到满意,则可以使用 如果您想避免使用,也可以这样做

  • 那么,问题是如何通过使用关键字列表在某些站点的联系人页面上动态地找到所有的文本字段和提交按钮?

  • 我正在寻找一种使用testng和selenium动态获取列值的方法。我有2个表用于显示帐户详细信息,例如帐户id、帐户名称、余额、可用余额。表1是 我想要一个方法,它将接受帐户id作为参数(例如:id2),

  • 问题内容: 我想在整个数据库中查找2-3个不同的列名称,并列出所有包含这些列的表。任何简单的脚本? 问题答案: 要获取所有具有列或数据库中的表: