在不知道 SQL 中的列的情况下创建表

Posted

技术标签:

【中文标题】在不知道 SQL 中的列的情况下创建表【英文标题】:Create a table without knowing its columns in SQL 【发布时间】:2017-01-18 13:26:13 【问题描述】:

如何在事先不知道它到底包含多少列和哪些列的情况下创建一个表?

我的想法是我有一个包含 3 列的表 DATA:IDNAMEVALUE

我需要的是一种根据 NAME 的值获取多个值的方法 - 我无法使用简单的 WHEREJOIN 来做到这一点(因为我需要其他值 - 使用其他 @987654328 @values - 稍后在我的查询中)。

由于此表的构造方式,我想PIVOT 它以便将NAME 的每个不同值转换为一列,以便在以后的搜索中更容易找到它。

我现在想要的是以某种方式将其保存到临时表/变量中,以便以后可以使用它来加入另一个查询的结果...

例如:

列:

CREATE TABLE MainTab
(
    id int, 
    nameMain varchar(max),
    notes varchar(max)
); 

CREATE TABLE SecondTab
(
    id int,
    id_mainTab, int,
    nameSecond varchar(max),
    notes varchar(max)
);

CREATE TABLE DATA
(
    id int,
    id_second int,
    name varchar(max),
    value varchar(max)
);

现在是 DATA 表中的一些示例数据:

|  id  | id_second_int |     name     |      value      |
|-------------------------------------------------------|
|  1   |     5550      |   number     |   111115550     |
|  2   |     6154      |   address    | 1, First Avenue |
|  3   |     1784      |   supervisor |    John Smith   |
|  4   |     3467      |   function   |    Marketing    |
|  5   |     9999      |   start_date |    01/01/2000   |
::::

现在想象“name”有很多不同的值,在一个查询中,我需要根据“name”的值获取很多不同的值... 这就是为什么我将它旋转,以便数字、地址、主管、函数、开始日期……成为列。 由于可能的列的数量,我动态地执行此操作 - 我需要一段时间才能将所有这些都写在“IN”语句中 - 而且我不想记住每次新的“名称”时都手动添加它' 增值... 所以我关注了http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/

问题是我希望我的 execute(@query) 的结果存储在 tempTab / 变量中。我想稍后使用它来加入 mainTab ...... 如果我可以使用 @cols(它保存 DATA.name 的值)会很好,但我似乎无法找到一种方法来做到这一点。

另外: 如果我使用非动态方式(在“IN”之后手动记下所有值),我仍然需要创建一个名为 status 的列。现在在此列中(到目前为止,它到处都是 NULL,因为我的未透视表中不存在该值)我想要“打开”或“关闭”,具体取决于日期(假设我有 start_date 和 end_date,

CASE end_date
WHEN end_date < GETDATE() THEN pivotTab.status = 'closed'
ELSE pivotTab.status = 'open'

我在哪里可以放置此声明?假设我的主要查询如下所示:

SELECT * FROM(
(SELECT id_second, name, value, id FROM TABLE_DATA) src
PIVOT (max(value) FOR name IN id, number, address, supervisor, function, start_date, end_date, status) AS pivotTab
JOIN SecondTab ON SecondTab.id = pivotTab.id_second
JOIN MainTab ON MainTab.id = SecondTab.id_mainTab

WHERE pivotTab.status = 'closed';

【问题讨论】:

【参考方案1】:

好吧,据我所知 - 您有一些 select 语句,只需要将其结果“转储”到某个临时表。在这种情况下,您可以使用 select into 语法,例如:

select .....
into #temp_table
from ....

这将根据 select 语句中的列创建临时表,并用 select datatement 返回的数据填充它。

参考MDSN。

【讨论】:

但是我必须将 temp_table 声明为一个表,然后它想知道不同的列 - 我不知道它将包含多少甚至哪些列......这就是我想要的原因使用动态 SQL 来做到这一点(但我在这方面是一个完全的菜鸟,并且仍在学习如何使用它)在这一点上完成我的任务我最需要的是关于我可以在我创建的 pivotTab 中填充某些列的位置的信息(例如,为列 status 提供数据,具体取决于表中的其他值) @LisekKL " 我必须将 temp_table 声明为表..." - 不,你不需要。 select into 会自动为您创建它并填充 select 语句返回的数据。还是我错过了你真正需要的东西? 好吧,抱歉,这对我不起作用的原因是因为我对数据库有只读访问权限,所以我无法创建表、函数或过程......你碰巧对如何使用 CASE 语句(以及放置位置)有任何想法,以便我可以根据需要在我的透视表中填充数据? @LisekKL 好吧,在 SQL Server 中没有创建 temporary 表的特殊权限,因此即使您对数据库具有只读访问权限 - 您仍然可以创建 temporary 表(不是永久的)并在您的进一步查询中使用它们,直到您与 SQL 服务器的连接未关闭。可能这就是你所需要的......

以上是关于在不知道 SQL 中的列的情况下创建表的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server,如何在不丢失数据的情况下创建表后设置自动增量?

SQL-如何在不自动增加 ID 列的情况下插入行?

如何创建验证另一个表中的列的 PL/SQL 行触发器

如何在更新单独表中的列的视图上创建触发器?

在不删除表的情况下更改模型中的 Django 数据类型

SQL Server:复制表中的列