【问题标题】:Building a temp table /map建立一个临时表/地图
【发布时间】:2008-10-28 17:15:21
【问题描述】:

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

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

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

知道怎么做吗?

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

我试图解决的问题与其说是只保留一个陈述,不如说是试图避免一遍又一遍地重新输入类别名称。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    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&"')"
    

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

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

    【讨论】:

    • 是的,通常我也会按照你的方式做,但 OP 想在一个声明中做到这一点:-)
    • 使用 Excel 生成语句有优点(赞成),但我认为我会选择(不寒而栗)联合答案,因为它更短。
    【解决方案2】:
    插入#maptable(类别,代码) 选择'foo1',b.bar 从 (选择'bar11'作为酒吧 联合选择'bar12' 联合选择'bar13' ) b 联盟 选择'foo2',b.bar 从 (选择'bar21'作为酒吧 联合选择'bar22' 联合选择'bar23' ) b

    【讨论】:

    • 不幸的是,我认为这可能是我能做的最好的事情了:(
    【解决方案3】:

    这可能对你有用:

    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
    

    【讨论】:

    • 这不是一个声明,而是避免一遍又一遍地重新输入类别。
    【解决方案4】:

    这是我最终使用的符号。它基于 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
    

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

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多