2015-08-15 16 views
0

我想从另一个表中创建一个临时表来动态创建存储过程。从另一个表创建一个动态临时表有一列使用过程

我有一个名为Tblstructure的表。该表只有1列Colname。列中的数据在运行时创建,并且每次都会更改。对于目前我有数据

Colname 
------- 
Region 
Country 
State 
Metric 
Value 

我想用上面的表,并形成具有柱动态表作为

Region Country state Metric value. 

每当用户调用存储过程,过程调用表tblstructure使出浑身表中的行并将它们转换为列标题。

如何做到这一点?

回答

0

我认为你需要研究的是连接表中各行存储的文本的模式。本资源列出了您应该阅读的一些常见模式:https://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

也就是说,XML路径模式是我最常使用的模式。

CREATE TABLE Tblstructure (Colname varchar(50)); 

INSERT INTO Tblstructure (Colname) 
VALUES ('Region'), ('Country'), ('State'), ('Metric'), ('Value'); 

DECLARE @ColumnDeclaration VARCHAR(2000) = 
    STUFF(
     (SELECT ', ' + Colname + ' VARCHAR(50) ' 
     FROM Tblstructure 
     FOR XML PATH(''), type).value('.', 'varchar(max)') 
    , 1, 1, '') 

SELECT 'CREATE TABLE SomeTempTable (' + @ColumnDeclaration + ');' 

输出:CREATE TABLE SomeTempTable (Region VARCHAR(50) , Country VARCHAR(50) , State VARCHAR(50) , Metric VARCHAR(50) , Value VARCHAR(50));

请注意,我不得不做出应该代表每个字段类型的假设。我假定每个字段都是VARCHAR(50),但是您可能想要找出推断每个字段应该是什么类型的更好方法。

工作例如:http://sqlfiddle.com/#!6/d4434/23

编辑

另外,请记住,这将不会是实际创建表,它只是给你动态CREATE TABLE语句。要执行此操作,您需要将生成的create table语句提供给sp_executesql。

+0

感谢您的回复。让我试试这个 – Mohit