我正在使用如下定义的临时表来处理SQL Server 2000中的存储过程:
CREATE TABLE #MapTable (Category varchar(40), Code char(5))
创建表后,我想插入一些标准记录(然后在程序中动态补充)。每个类别(大约10个)将有几个代码(通常为3-5),我想在一个语句中表达每个类别的插入操作。
知道怎么做吗?
我到目前为止最好的想法是将数据库中的一个真实表作为模板,但我真的希望尽可能避免这种情况。这将存在的数据库是大型机系统的快照,这样整个数据库每晚都被吹走并在批处理过程中重新创建 - 存储过程在进程结束时从源代码控制中重新加载。 / p>
我试图解决的问题不是将其保留在一个语句中,因为它试图避免一遍又一遍地重新键入类别名称。
答案 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
这种方式稍微突出显示类别名称,垂直排列代码,并使用较少的垂直空间。