从具有特定表名称的所有表中选择所有值

时间:2014-07-23 17:04:06

标签: sql sql-server select dynamic-sql

编辑原始问题:

我们的UDW分为属性和属性列表表。

我想编写一个数据字典查询,动态地从所有类似%attr_list%的表中提取所有列值,而不必编写一系列联合,并在每次创建新属性列表时更新或添加在我们的UDW中。

我们现有的所有属性列表都遵循相同的格式(列数,大多数列名等)。下面是我们现有视图中的前两个联合,我希望每次将新属性列表添加到UDW时都不要更新。

CREATE VIEW [dbo].[V_BI_DATA_DICTIONARY]
(      ATTR_TABLE
  ,ATTR_LIST_ID
  ,ATTR_NAME
  ,ATTR_FORMAT
  ,SHORT_DESCR
  ,LONG_DESCR
  ,SOURCE_DATABASE
  ,SOURCE_TABLE
  ,SOURCE_COLUMN
  ,INSERT_DATETIME
  ,INSERT_OPRID
   )
AS

SELECT 'PREAUTH_ATTR_LIST'             ATTR_TABLE
  ,[PREAUTH_ATTR_LIST_ID]          ATTR_LIST_ID
  ,[ATTR_NAME]                     ATTR_NAME
  ,[ATTR_FORMAT]                   ATTR_FORMAT
  ,[SHORT_DESCR]                   SHORT_DESCR
  ,[LONG_DESCR]                    LONG_DESCR
  ,[SOURCE_DATABASE]               SOURCE_DATABASE
  ,[SOURCE_TABLE]                  SOURCE_TABLE
  ,[SOURCE_COLUMN]                 SOURCE_COLUMN
  ,[INSERT_DATETIME]               INSERT_DATETIME
  ,[INSERT_OPRID]                  INSERT_OPRID
FROM [My_Server].[MY_DB].[dbo].[PREAUTH_ATTR_LIST]

UNION
SELECT 'SAVINGS_ACCOUNT_ATTR_LIST'     
  ,[SAVINGS_ACCOUNT_ATTR_LIST_ID]  
  ,[ATTR_NAME]                     
  ,[ATTR_FORMAT]                   
  ,[SHORT_DESCR]                   
  ,[LONG_DESCR]                    
  ,[SOURCE_DATABASE]
  ,[SOURCE_TABLE]
  ,[SOURCE_COLUMN]
  ,[INSERT_DATETIME]               
  ,[INSERT_OPRID]                  
FROM [My_Server].[MY_DB].[dbo].[SAVINGS_ACCOUNT_ATTR_LIST]'

3 个答案:

答案 0 :(得分:0)

对于SQL Server,您应该可以使用以下内容:

SELECT c.name AS ColName, t.name AS TableName
FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name LIKE '%attr_list%'

这将包括视图和表格

SELECT COLUMN_NAME, TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME LIKE '%attr_list%'

答案 1 :(得分:0)

如果所有表包含相同的列,则此类内容可能对您有用。 只需更改临时表和所选列以匹配您自己的列。

CREATE TABLE #results (
    ATTR_TABLE SYSNAME,
    ATTR_LIST_ID INT,
    ATTR_NAME NVARCHAR(50),
    ATTR_FORMAT NVARCHAR(50),
    SHORT_DESCR NVARCHAR(50),
    LONG_DESCR NVARCHAR(255),
    SOURCE_DATABASE NVARCHAR(50),
    SOURCE_TABLE NVARCHAR(50),
    SOURCE_COLUMN NVARCHAR(50),
    INSERT_DATETIME DATETIME,
    INSERT_OPRID INT
);

INSERT INTO #results
EXEC sp_MSforeachtable @command1 = 
    ' 
        SELECT ''?''
             , *
        FROM ? 
        WHERE ''?'' LIKE ''%ATTR_LIST%''
    '

SELECT *
FROM #results

DROP TABLE #results

编辑:用您的列更新了我的示例。因为您在每个表中为ATTR_LIST_ID使用了不同的列名,所以我将select更改为SELECT *。显然,我不知道列的数据类型,因此您必须更改它们。

这不会在视图中工作,但您可以创建存储过程。

答案 2 :(得分:-1)

如果使用MS SQL Server,请查看sys catalog views。您可以使用sys.tables并连接到sys.columns来获取表和列。 sys.extended_properties可以为您提供描述信息(如果输入)。