Создание временной таблицы / карты - PullRequest
2 голосов
/ 28 октября 2008

Я работаю над хранимой процедурой в SQL Server 2000 с временной таблицей, определенной следующим образом:

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

После создания таблицы я хочу вставить некоторые стандартные записи (которые затем будут динамически дополняться в процедуре). Каждая категория (около 10) будет иметь несколько кодов (обычно 3-5), и я хотел бы выразить операцию вставки для каждой категории в одном выражении.

Есть идеи, как это сделать?

Лучшая идея, которая у меня была до сих пор, - это сохранить реальную таблицу в БД в качестве шаблона, но я бы очень хотел этого избежать, если это возможно. База данных, в которой это будет храниться, представляет собой снимок системы мэйнфреймов, так что вся база данных сдувается каждую ночь и воссоздается в пакетном процессе. Хранимые процедуры перезагружаются из системы контроля версий в конце процесса. 1008 *

Проблема, которую я пытаюсь решить, не столько сводит ее к одному утверждению, сколько пытается избежать повторного ввода имени категории снова и снова.

Ответы [ 4 ]

5 голосов
/ 28 октября 2008

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

В диджеях нет ничего плохого, мне это показалось слишком сложным.


Из ОП:

Проблема, которую я пытаюсь решить, не столько сводит ее к одному утверждению, сколько пытается избежать повторного ввода названия категории.

Я чувствую вашу боль - я тоже пытаюсь найти такие ярлыки и понимаю, что к тому времени, когда я решу проблему, я мог бы набрать ее длинной рукой.

Если у меня есть много повторяющихся данных для ввода, я иногда использую Excel для генерации кодов вставки для меня. Поместите категорию в один столбец, а код - в другой; использовать все полезные методы копирования, чтобы выполнить тяжелую работу

затем

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

в третьем ряду, и я сгенерировал вставки

Конечно, все это предполагает, что категории и коды не могут быть извлечены из системной таблицы.

1 голос
/ 28 октября 2008
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 голосов
/ 28 октября 2008

Вот запись, которую я в итоге использовал. Он основан на ответе Арво, но немного короче и использует 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

Этот способ немного выделяет названия категорий, выравнивает коды по вертикали и использует меньше вертикального пространства.

0 голосов
/ 28 октября 2008

Это может работать для вас:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...