Динамическая вставка таблицы TSQL - PullRequest
2 голосов
/ 13 сентября 2011

Привет всем, я боролся с этим некоторое время сейчас! У меня есть несколько файлов данных с датой в них, они сбрасываются в промежуточную таблицу. То, что я хотел бы, чтобы мой сценарий / функция сделал, чтобы прочитать дату для каждой записи в промежуточной таблице и перейти к соответствующей таблице. Теперь я знаю, что могу сделать это очень легко, просто используя некоторые статические вставки, например

INSERT INTO TABLE_2011_08
WHERE Datafields = 2011_08

Однако я хочу, чтобы оно было динамичным, поэтому я думал, что-то вроде функции / хранимой процедуры для передачи даты для каждой записи. Однако мой мозг немного тает от этого!

Записи данных в промежуточной таблице могут выглядеть примерно так: -

RecordA 2011-08-30 Data Data Data
RecordB 2011-08-31 Data Data Data
RecordC 2011-09-01 Data Data Data
RecordD 2011-09-02 Data Data Data

Ответы [ 3 ]

4 голосов
/ 13 сентября 2011

Вот, пожалуйста:

CREATE TABLE dbo.Some_Meaningful_Descriptive_Name (
    record_id    CHAR(7)        NOT NULL,
    some_date    DATETIME       NOT NULL,
    some_data    VARCHAR(20)    NOT NULL,
    ...
)

Теперь ваш процесс импорта просто должен поместить их в таблицу.Нет динамических требований и нет необходимости создавать новую таблицу каждый месяц.

Если вам действительно нужно, чтобы они выглядели отдельно, создайте представления для таблицы:

CREATE VIEW dbo.Some_Meaningful_Descriptive_Name_2011_08
AS
BEGIN

    SELECT
        record_id,
        some_data
    FROM
        dbo.Some_Meaningful_Descriptive_Name
    WHERE
        some_date >= '2011-08-01 00:00:00.000' AND
        some_date <  '2011-09-01 00:00:00.000'
END

Это будет довольно редко, когда у вас так много строк, что вам нужно поместить их в отдельные таблицы.(мы говорим десятки миллионов строк).С разделением сейчас, даже тогда, вероятно, нет необходимости.

Размещение их в отдельных таблицах только усложнит работу с ними в будущем.

3 голосов
/ 13 сентября 2011

Если я правильно вас понял, вы хотите сгенерировать INSERT операторов с динамически изменяющимся именем таблицы?

Вы можете создать свой SQL-запрос в виде строки и выполнить его с помощью EXEC:

DECLARE @sql nvarchar(MAX)
SELECT @sql = N'INSERT ' + @tableName + ' VALUES (...)'

EXEC (@sql)

Самый простой способ добиться маршрутизации данных - это итерация промежуточных данных с помощью курсора и создание строки динамического вставки SQL в этом цикле.

Затем выполните пакет вставки с помощью одной команды EXEC.

2 голосов
/ 13 сентября 2011

Таблица T похожа на вашу таблицу, я заполнил ее тестовыми данными, близкими к вашим, заполненные вами таблицы будут созданы, если их не будет.

Попытка воссоздать ваш стол

CREATE TABLE T(name varchar(10), date datetime)

insert t values('RecordA','2011-08-30')
insert t values('RecordB','2011-08-31')
insert t values('RecordC','2011-09-01')
insert t values('RecordD','2011-09-02')

Этот синтаксис будет при необходимости создавать и заполнять таблицы, такие как TABLE_YYYY_MM. ГГГГ и ММ - любая найденная комбинация таблицы T

Declare @tablename varchar(64)
Declare @sql as varchar(max)
Declare @d as datetime
Declare dCursor CURSOR FAST_FORWARD FOR
SELECT DISTINCT dateadd(month, datediff(m, 0, date), 0) date from t
OPEN dCursor
FETCH NEXT FROM dCursor
INTO @d
WHILE @@FETCH_STATUS = 0
BEGIN
SET @tablename = '[TABLE_'+replace(CONVERT(VARCHAR(7), @d, 121), '-', '_') + ']'
SET @SQL = 
'if OBJECT_ID('''+@tablename+''', ''U'') is null 
BEGIN
Declare @sql2 varchar(max)
SET @sql2 = ''SELECT * INTO '+@tablename+'
FROM t WHERE 1 = 2''
EXEC(@sql2)
END
INSERT INTO '+ @tablename+'
SELECT * FROM t
WHERE datediff(m, 0, date)=' + CAST(datediff(m, 0, @d) AS VARCHAR(10))

EXEC(@SQL)
FETCH NEXT FROM dCursor
INTO @d

END
CLOSE dCursor
DEALLOCATE dCursor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...