2016-08-29 80 views
0

我有一個主表,其中包含與該表對應的表名稱和列。如何編寫程序以獲取表格的所有數據?

我想編寫一個遍歷表的所有記錄並獲取所有數據並將其作爲單個結果集返回的過程。

+0

哪一個呢? Oracle或SQL Server? –

+0

簡單的答案是「動態查詢」。所有列的數據類型也應該相同。 –

+0

對於Oracle,您可以使用類型與表結構類似的'Type',並在'out'條件中提及它 –

回答

0

您需要使用Dynamic Query

DECLARE @sql VARCHAR(max)='' 

SET @sql = (SELECT @sql + 'select ' + column_name + ' from ' 
        + table_name + ' union all ' 
      FROM master_table 
      FOR xml path('')) 

SELECT @sql = LEFT(@sql, Len(@sql) - 9) 
EXEC (@sql) 

注:所有列的數據類型應該是相同的。如果不是的話,那麼你可能需要做顯式轉換到varchar

SET @sql = (SELECT @sql + 'select cast(' + column_name + ' as varchar(4000)) from ' 
         + table_name 
        + ' union all ' 
      FROM Master_table 
      FOR xml path('')) 
+0

是的...當然,列的數量應該是相同的:) – Anton

+0

但我有不同的列不同的列 –

0

假設在你的主表列出的所有表中具有相同的順序和數據類型相同的列。然後,它會是如下:

create table ##a 
(
    Value int 
) 

create table ##b 
(
    Value int 
) 

create table ##c 
(
    Value int 
) 

declare @all table 
(
    Value int 
) 

declare @master table 
(
    TableName varchar(10) 
) 

declare @TableName varchar(10) 

insert ##a values (1), (2), (3) 
insert ##b values (4), (5), (6) 
insert ##c values (7), (8), (9) 

insert @master values ('##a'), ('##b'),('##c') 

declare looper cursor local static forward_only read_only for 
select TableName from @master 
open looper 
fetch next from looper into @TableName 
while @@fetch_status = 0 
begin 
    insert @all exec('select Value from ' + @TableName) 
    fetch next from looper into @TableName 
end 
close looper 
deallocate looper 

select * from @all 

drop table ##a 
drop table ##b 
drop table ##c 

如果表是不同的結構,請訪問:Stored procedures and multiple result sets in T-SQL。它會將每個表格的內容壓縮到單個XML單元格中。文章還解釋瞭如何閱讀它們。

0

我假設你在主表中使用了許多具有不同列的表。你應該循環你的主表。試試這個,

DECLARE @sql NVARCHAR(max) = '' 
DECLARE @start INT = 1 
    ,@end INT = 0 
    ,@tablename VARCHAR(100) = '' 
DECLARE @TableList TABLE (
    id INT identity(1, 1) 
    ,tablename VARCHAR(128) 
    ) 

INSERT INTO @TableList (tablename) 
SELECT DISTINCT table_name 
FROM YourMasterTableName 
WHERE TABLE_NAME = 'productss' 

SET @end = @@ROWCOUNT 

WHILE (@start <= @end) 
BEGIN 
    SET @tablename = (
      SELECT tablename 
      FROM @TableList 
      WHERE id = @start 
      ) 
    SET @sql = (
      SELECT ',[' + column_name + ']' 
      FROM YourMasterTableName M 
      WHERE TABLE_NAME = @tablename 
      FOR XML path('') 
      ) 
    SET @sql = 'SELECT ' + stuff(@sql, 1, 1, '') + ' FROM ' + @tablename 

    EXEC sp_executesql @sql 

    SET @start = @start + 1 
END 
相關問題