繁体   English   中英

动态表插入TSQL

[英]Dynamic Table Insert TSQL

大家好,我一直在努力这一段时间了! 我有一些数据文件,其中包含日期,这些文件被转储到临时表中。 我希望我的脚本/函数做的是读取登台表中每条记录的日期并移动到适当的表。 现在我知道我可以很容易地使用一些静态插入,例如

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

干得好:

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

当你有这么多行需要将它们实际放入单独的表中时,这将非常罕见。 (我们正在谈论数百万行的10个)。 现在进行分区,即便如此,也可能没有必要。

将它们放在单独的表中只会使将来更难与它们一起工作。

如果我理解你,你想生成具有动态变化的表名的INSERT语句吗?

您可以将SQL查询构造为字符串并使用EXEC执行它:

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

EXEC (@sql)

实现数据路由的最简单方法是使用游标迭代临时数据,并在该循环中创建动态插入sql字符串。

然后使用单个EXEC命令执行插入批处理。

表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之类的表。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM