动态表插入TSQL

时间:2011-09-13 11:54:21

标签: sql sql-server tsql sql-server-2008 ssis

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

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 个答案:

答案 0 :(得分:4)

你走了:

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个)。现在进行分区,即便如此,也可能没有必要。

将它们放入单独的表中将会使将来更难与它们合作。

答案 1 :(得分:3)

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

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

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

EXEC (@sql)

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

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

答案 2 :(得分:2)

表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