sql - 如何通过脚本自动生成临时表列和数据类型

标签 sql sql-server sql-server-2008

我经常在 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)

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

最佳答案

这可能会给你一个开始:

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

编辑:临时表:

临时表略有不同,例如这适用于名为#tv_source 的临时表的 sql 2008

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 或东西。不过,它应该能让您开始想要做的事情。

请注意,对于其他人,sql 2000 不会正确显示长度,例如在 varchar(45) 上,它只会列出 varchar 部分,我没有尝试针对这个问题重新处理它。

关于sql - 如何通过脚本自动生成临时表列和数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328353/

相关文章:

python - 如何在 python 中动态绑定(bind) SQL 查询的多个参数?

MYSQL 为 WHERE 匹配行增加 'SHOWN' 行

c# - 以存储过程作为参数调用函数

sql-server - SSRS多值参数-实现过滤器的适当层

mysql - 外键有重复且没有主键

mysql - 短路UNION? (如果第一个子句没有结果,只执行第二个子句)

c# - 使用 Entity Framework 在 sql server 中加密/解密列

mysql - 如何在类似于 MS SQL Server 的 MySQL 中分解列名?

sql - 逐行求和并选择结果集中的其他列

mysql - 哪个数据库 (DBMS) 最能处理大型表?