构建临时表/地图

时间:2008-10-28 17:15:22

标签: sql sql-server tsql

我正在使用如下定义的临时表来处理SQL Server 2000中的存储过程:

CREATE TABLE #MapTable (Category varchar(40), Code char(5))

创建表后,我想插入一些标准记录(然后在程序中动态补充)。每个类别(大约10个)将有几个代码(通常为3-5),我想在一个语句中表达每个类别的插入操作。

知道怎么做吗?

我到目前为止最好的想法是将数据库中的一个真实表作为模板,但我真的希望尽可能避免这种情况。这将存在的数据库是大型机系统的快照,这样整个数据库每晚都被吹走并在批处理过程中重新创建 - 存储过程在进程结束时从源代码控制中重新加载。 / p>

我试图解决的问题不是将其保留在一个语句中,因为它试图避免一遍又一遍地重新键入类别名称。

4 个答案:

答案 0 :(得分:5)

DJ是一个很好的解决方案,但可以简化(见下文)。

为什么需要单一声明?

出了什么问题:

insert into #MapTable (category,code) values ('Foo','AAAAA')
insert into #MapTable (category,code) values ('Foo','BBBBB')
insert into #MapTable (category,code) values ('Foo','CCCCC')
insert into #MapTable (category,code) values ('Bar','AAAAA')

对我来说,这更容易阅读和维护。


简化的DJ解决方案:

CREATE TABLE #MapTable (Category varchar(40), Code char(5))

INSERT INTO #MapTable (Category, Code)
SELECT 'Foo', 'AAAAA'
UNION
SELECT 'Foo', 'BBBBB'
UNION
SELECT 'Foo', 'CCCCC' 

SELECT * FROM #MapTable

DJ并没有什么问题,只是觉得我过于复杂。


来自OP:

  

我试图解决的问题不是将其保留在一个声明中   试图避免一遍又一遍地重新输入类别名称。

我感觉到你的痛苦 - 我也试图找到这样的捷径,并意识到当我解决问题时,我可以长时间输入它。

如果我要输入大量重复数据,我有时会使用Excel为我生成插入代码。将类别放在一列中,将代码放在另一列中;使用所有有用的复制技术来完成艰苦的工作

然后

="insert into #MapTable (category,code) values ('"&A1&"','"&B1&"')"

在第三行,我已经生成了我的插入

当然,所有这一切都假设无法从系统表中提取类别和代码。

答案 1 :(得分:1)

insert into #maptable (category, code)
select 'foo1', b.bar
from  
    (   select 'bar11' as bar
        union select 'bar12'
        union select 'bar13'
    ) b
union
select 'foo2', b.bar
from  
    (   select 'bar21' as bar
        union select 'bar22'
        union select 'bar23'
    ) b

答案 2 :(得分:0)

这可能对您有用:

CREATE TABLE #MapTable (Category varchar(40), Code char(5))

INSERT INTO #MapTable 
SELECT X.Category, X.Code FROM
(SELECT 'Foo' as Category, 'AAAAA' as Code
UNION
SELECT 'Foo' as Category, 'BBBBB' as Code
UNION
SELECT 'Foo' as Category, 'CCCCC' as Code) AS X

SELECT * FROM #MapTable

答案 3 :(得分:0)

这是我最终使用的符号。它基于Arvo的答案,但更短一些,并使用cAse帮助使事情更清晰:

SELECT 'foo1', b.code
FROM ( select 'bar11' as code
 union select 'bar12'
 union select 'bar13' ) b

UNION SELECT 'foo2', b.code
FROM ( select 'bar21' as code
 union select 'bar22' 
 union select 'bar32' ) b

这种方式稍微突出显示类别名称,垂直排列代码,并使用较少的垂直空间。