2008-10-28 48 views
2

我工作的一个存储过程在SQL Server 2000中,像这样定义的临时表:建立一个临时表/图

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

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

任何想法如何做到这一点?

我到目前为止最好的想法是在db中保留一个真实的表作为模板,但是如果可能的话,我真的很想避免这种情况。它所在的数据库就是大型机系统的快照,这样整个数据库每晚都会被吹走,并在批处理过程中重新创建 - 存储过程在过程结束时从源代码管理中重新加载。

我试图解决的问题并非如此,因为它试图避免重复键入类别名称一遍又一遍。

回答

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 
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 
+0

这不是一个声明,因为它避免了重复输入类别一遍又一遍。 – 2008-10-28 18:28:36

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&"')" 
在第三排

,我已经生成的你插入

当然,所有这一切都是假设分类而代码不能从系统表中提取。

+0

是的,我通常也会这样做,但是OP希望在一个声明中做到这一点:-) – 2008-10-28 18:00:01

+1

使用Excel生成语句有优点(upvote),但我认为我要与(颤抖)联合答案,因为它更短。 – 2008-10-28 19:56:22

0

这是我最终使用的符号。它是基于帕特的答案,但有点短,使用情况,以帮助使事情更清晰:

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 

这样突出了类别名称了一下,排队代码垂直,并使用更少的垂直空间。