2013-01-14 26 views
2

我经常在SQL中创建临时表,我正在研究一种自动为表定义生成列名和数据类型的方法,所以我不必看它们每次都是。如何通过脚本自动生成临时表列和数据类型

比如我运行:

SELECT CustomerID 
    ClientID, 
    FirstName 
    LastName 
INTO #Test 
From dbo.Customer 

要初步建立临时表与相应的列和数据,我需要。一旦我得到的一切完成后,我再回去,并采取了INTO语句,并写:

CREATE TABLE #Test 
(
... 
... 
); 

我想找到一种方法来自动从最初的创作产生的列名和数据类型临时表。现在,因为我最初插入自动创建临时表,我用这个:

EXEC tempdb..sp_help '#Test'; 

这给了我一切,我需要,而不必看所有的列数据类型,但我想知道是否有一种只是将列名自动生成的方法。所以自动生成将生成:

CustomerID int, 
ClientID int, 
FirstName varchar(50), 
LastName varchar(50) 

这将允许我只复制并粘贴到我的创建表语句。

回答

8

这可能会给你一个开始:

DECLARE @viewname VARCHAR(50); 
SET @viewname ='tableorviewname'; 
SELECT c.name + ' '+ t.name + 
case t.name 
WHEN 'varchar' THEN '('+CAST(c.max_length AS VARCHAR(3))+'),' 
ELSE ',' 
end 
FROM sys.columns c 
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id 
WHERE object_id = (SELECT object_id from sys.objects where name = @viewname) 
ORDER BY c.column_id 

编辑:TEMP表:

临时表略有不同,比如这部作品在SQL 2008名为#tv_source

一个临时表
DECLARE @viewortablename VARCHAR(50); 
SET @viewortablename ='tempdb..#tv_source'; 
SELECT c.name + ' '+ t.name + 
case t.name 
WHEN 'varchar' THEN '('+CAST(c.max_length AS VARCHAR(3))+'),' 
ELSE ',' 
end 
FROM tempdb.sys.columns c 
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id 
WHERE object_id = object_id(@viewortablename) 
ORDER BY c.column_id 

注意:这会给出一个逗号分隔的列表,但不会尝试删除最后一个逗号,它只给出一个列表,您可能希望将其放在一个字符串上并进行操作等。母鸡用作动态sql或somthing。不过,它应该让你开始做你想做的事。

对于其他人来说,对于varchar(45)而言,sql 2000不会正确显示长度,它只会列出varchar部分,并且我没有试图针对这个问题重做。

+0

出于某种原因,我无法找到我的临时表在sys.objects中所以这总是返回空白 – mameesh

+1

我添加了额外的例子对于临时表中,请注意临时表名OBJECT_ID差=和临时表当然这当然存在。 –

+0

非常有用。我添加了几个额外的子句,以便您可以设置正确的精度。 ('CAST(c.max_length AS VARCHAR(3)))+','+ rtrim(CAST(c.precision AS VARCHAR(3)))+'),' ' –

1
SELECT 
', ['+ac.name+'] '+Type_Name(User_type_id)+ 
CASE WHEN Type_Name(User_type_id) = 'Decimal' 
     THEN +'('+CONVERT(Varchar(4),ac.Precision)+','+CONVERT(Varchar(4),ac.Scale)+')' 
     WHEN Type_Name(User_type_id) IN 
      ('tinyint','smallint','int','real','money','float','numeric','smallmoney','DateTime') 
     THEN '' 
     ELSE +'('+CONVERT(Varchar(4),ac.Max_Length)+')' 
END AS TableColumn 
FROM Tempdb.sys.all_columns AS ac 
     INNER JOIN Tempdb.Sys.SysObjects AS so 
      ON so.ID = ac.Object_ID 
WHERE 1 = 1 
AND so.Name = '##YourTempTableGoesHere'