【问题标题】:Information_schema.columns in the query查询中的 Information_schema.columns
【发布时间】:2019-03-07 17:54:53
【问题描述】:

我需要从所有具有“custom1、custom2、custom3.....”列的表中的自定义列中提取数据。

Declare @TableName varchar(max)
set @TableName = 'RandomTable';

with main as 
(
     select distinct 
         infos.COLUMN_NAME, infos.TABLE_NAME
     from 
         INFORMATION_SCHEMA.COLUMNS infos
     where 
         infos.TABLE_NAME = @TableName
         and infos.COLUMN_NAME like 'Custom%%'
)

此查询返回我在参数中指定的任何表中的自定义列的列表。知道如何在查询中使用它,以便我可以从 RandomTable.Custom%% 列中获取所有数据吗?

有什么想法吗?我正在失去它的情节。

【问题讨论】:

  • 您的意思是,如果您要获得三个值(如在三列中),您想获得这些列中的值吗?如果是这样,您希望检索三个单独的列还是希望在一列中返回所有值?
  • 我希望能够在参数中指定我想要的任何表格。如果该表有 3 列名称分别为“Custom1”、“Custom2”、“Custom3”,那么我希望将这些列中的值提取到名为“Custom1”、“Custom2”和“Custom3”的单独列中。如果表有 10 个“自定义”列,则相同。需要是某种动态的。
  • 这可能不是最干净的解决方案,但也许你可以做这样的事情... 第 1 步:创建一个临时表。第 2 步:使用 CTE 作为游标的选择语句。第 3 步:在游标内,创建一个动态 sql-statement(只是一个将生成 sql-code 的 varchar 变量) 第 4 步(测试):打印@SqlStatement 以检查查询是否是正确的 sql。第 5 步:运行类似 (EXEC @ SqlStatement) 的 sql 代码,而 @SqlStatement 在运行时会将数据惰性化到临时表中。第六步:关闭光标。第 7 步:从 TempTable 读取结果

标签: sql join schema information-schema


【解决方案1】:

按照 incomudro 的想法并猜测您正在使用 SQL Server,您可以执行以下操作:

DECLARE 
  @TableName VARCHAR(MAX)
 ,@ColumnName VARCHAR(MAX)
 ,@SQLQuery VARCHAR(MAX)
 ,@FirstFlag BIT
SET @TableName = 'TEST'

SELECT
  COL.COLUMN_NAME
INTO ##CUSTOM_COL
FROM INFORMATION_SCHEMA.COLUMNS COL
WHERE 1 = 1
 AND COLUMN_NAME LIKE 'CUSTOM__'
 AND TABLE_NAME = @TableName

DECLARE CUR_CUSTOM_COL CURSOR FOR
SELECT * FROM ##CUSTOM_COL

OPEN CUR_CUSTOM_COL  
FETCH NEXT FROM CUR_CUSTOM_COL INTO @ColumnName  

SET @FirstFlag = 1
SET @SQLQuery = 'SELECT *'

WHILE @@FETCH_STATUS = 0  
BEGIN
  IF @FirstFlag = 0
  BEGIN
    SET @SQLQuery = @SQLQuery + ', '
  END

  SET @SQLQuery = @SQLQuery + @ColumnName 

  SET @FirstFlag = 0
  FETCH NEXT FROM CUR_CUSTOM_COL INTO @ColumnName
END 

CLOSE CUR_CUSTOM_COL  
DEALLOCATE CUR_CUSTOM_COL

SET @SQLQuery = @SQLQuery + ' FROM ' + @TableName
EXEC(@SQLQuery)

我将我的工作区保存在这个fiddle 中。不幸的是,它在那里不起作用,但它应该在你的 SQL 客户端中(或者我犯了一点打字错误)。通过一些小的修改,您不仅可以显示 1 个指定表中的自定义列,还可以显示所有表中的自定义列。除了选择它之外,您还可以从临时表中的自定义列中插入输出。

【讨论】:

  • 我收到(0 行受影响)消息 156,级别 15,状态 1,第 1 行关键字“FROM”附近的语法不正确。
  • 我的错,我错过了SET @SQLQuery = 'SELECT *' 中的*:代码现在应该可以工作了
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多