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

SQL:返回列名,其中列包含给定值

杜绍元
2023-03-14
问题内容

我想知道是否可以在SQL Server中运行一个命令/存储的程序,该程序将为我提供包含表中给定数据的列的名称。

因此,如果我要查询,请给我该表中所有包含值75的列。我不希望该行。只是表中的列名…这可能吗?


问题答案:
-- input parameters (guessing on type for @value):

DECLARE 
  @schema SYSNAME = N'dbo', 
  @table  SYSNAME = N'z', 
  @value  VARCHAR(64) = '75';


-- now, inside the procedure body:

DECLARE @sql NVARCHAR(MAX) = N'SELECT ''cols:'' + STUFF(''''';

SELECT @sql += N' 
  + CASE WHEN EXISTS (SELECT 1 FROM ' 
  + QUOTENAME(@schema) + '.' + QUOTENAME(@table)
  + ' WHERE TRY_CONVERT(VARCHAR(64), ' + QUOTENAME(c.name) 
  + ') = @value) THEN '', ' + c.name + ''' ELSE '''' END'
FROM sys.tables AS t
INNER JOIN sys.columns AS c
ON t.[object_id] = c.[object_id]
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
WHERE t.name = @table AND s.name = @schema;

SET @sql += N', 1, 1, '''');'

PRINT @sql;

--EXEC sp_executesql @sql, N'@value VARCHAR(64)', @value;

当您对输出感到满意时,请取消注释EXEC

因此,让我们考虑一个简单的表:

CREATE TABLE dbo.floob
(
  a INT, 
  b VARCHAR(32), 
  c VARBINARY(22), 
  d DATE, 
  e DATETIME, 
  f ROWVERSION
);

INSERT dbo.floob(a,b,c,d,e) VALUES
( 75, 'foo', 0x00, GETDATE(), GETDATE()),
( 21, '75',  0x00, GETDATE(), GETDATE());

现在,基于上述代码的存储过程:

CREATE PROCEDURE dbo.FindStringInAnyColumn
  @schema SYSNAME = N'dbo', 
  @table  SYSNAME,
  @value  VARCHAR(64)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX) = N'SELECT ''cols:'' + STUFF(''''';

  SELECT @sql += N' 
    + CASE WHEN EXISTS (SELECT 1 FROM ' 
    + QUOTENAME(@schema) + '.' + QUOTENAME(@table)
    + ' WHERE TRY_CONVERT(VARCHAR(64), ' + QUOTENAME(c.name) 
    + ') = @value) THEN '', ' + c.name + ''' ELSE '''' END'
  FROM sys.tables AS t
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  INNER JOIN sys.schemas AS s
  ON t.[schema_id] = s.[schema_id]
  WHERE t.name = @table AND s.name = @schema;

  SET @sql += N', 1, 1, '''');'

  EXEC sp_executesql @sql, N'@value VARCHAR(64)', @value;
END
GO

用法示例:

EXEC dbo.FindStringInAnyColumn @table = N'floob', @value = '75';

输出:

Cols: a, b


 类似资料:
  • 假设我在两个不同的数据库 数据库中的< code>static表具有如下列: < code>apartments数据库中的< code>static表具有如下列: 我想在不引发任何错误的情况下运行下面的查询。目前,我得到错误,因为列不存在于中。 我尝试的解决方案: 它有效,但是当涉及更多列时,此查询会变得混乱。 我在寻找什么: > < li> 创建一个函数,该函数采用列名和表名,然后执行我在上述查

  • 将从非null元素返回最小值。 我想编写一个查询,将NULL视为可能的最小值。 我见过使用特殊值的日期技巧,如下所示:https://stackoverflow.com/a/32240382/7810882 但是,如果列的类型是并且没有可以映射到的特殊值怎么办?

  • 本文向大家介绍计算Python列表中包含给定元素的子列表,包括了计算Python列表中包含给定元素的子列表的使用技巧和注意事项,需要的朋友参考一下 给定列表中的元素也可以作为另一个字符串出现在另一个变量中。在本文中,我们将查看给定列表中给定流出现了多少次。 随着范围和镜头 我们使用range和len函数来跟踪列表的长度。然后使用in条件查找字符串在列表中作为元素出现的次数。每当满足条件时,初始化为

  • 问题内容: 我试图取消有多个行和列的表。每行需要引出到具有特定列的2行,并且列名需要重命名,并且需要根据所选列添加新列! 我包括示例数据之前和之后以及用于设置数据的脚本。 我已经尝试过了,但是我无法通过第二列,而且我不确定如何添加带有特定文本的新列(可能是动态sql,但如果可能的话,尽量避免这种情况) 这是我尝试的开始,我们将不胜感激。 问题答案: 你只是保持不懈 并加入col列以滤除不匹配项

  • 问题内容: 我有一个俗称“条件名称”(已从服务器生成.sql文件) 但是在android中,从该表读取数据时出现以下异常。 12-24 14:34:00.870:W / System.err(269):android.database.sqlite.SQLiteException:无此类列:条件:, 编译时: 选择条件,类别,子类别,条件名称,本地路径,远程路径,标题,content_type F

  • 问题内容: 我希望有人根据以下示例表对以下内容提供快速的建议/解决方案: 我希望能够建立一个查询来返回其名称(基于单个记录)= 1的列名称。这无需依赖游标或临时表。 即我想要以下输出: 我一直在尝试对(和)进行各种联接,但到目前为止收效甚微。 问题答案: 您也可以使用 要动态工作,请使用此功能。