T-SQL基于另一个表创建新表

时间:2013-11-16 12:13:05

标签: sql sql-server

我是T-SQL的新手所以没有知识和知识。我正在使用SQL Server 2012.目前我有一个名为dbo.Securities的表,其中包含两列。一列称为PairNamenchar(15))&另一列称为RunPairbit)。该表包含30行。

我想要做的是创建30个新表,它们都具有相同的结构。该结构是datetime类型的一列,它将成为主键&必须要到第二个。还有12个其他列都属于decimal(5,5)类型。

30个表格将以表格PairName中的dbo.Securities列命名。我一直试图找出如何循环遍历dbo.Securities表,并使用PairName基于上述结构创建一个新表。

然而,在阅读了一些指南之后,看起来循环通过表并不是尝试完成此任务的最佳方式。

3 个答案:

答案 0 :(得分:1)

请注意,您需要在以下代码中编辑表架构部分。这个循环将构建30个表。至于最好和最快的方法?使用TSQL这比手动构建每个表更快,但我不知道它是否是最快的方法。

DECLARE @Build TABLE(
        ID SMALLINT IDENTITY(1,1),
        TableName VARCHAR(250)
)

INSERT INTO @Build
SELECT PairName
FROM dbo.Securities

DECLARE @begin SMALLINT = 1, @max SMALLINT, @sql NVARCHAR(MAX), @table NVARCHAR(250)
SELECT @max = MAX(TableID) FROM @Build

WHILE @begin <= @max
BEGIN

        SELECT @table = TableName FROM @Build WHERE ID = @begin

        SET @sql = 'CREATE TABLE ' + @table + '(
        -- EDIT TABLE COLUMNS HERE
        )'

        EXECUTE sp_executesql @sql

        PRINT 'TABLE ' + @table + ' has been built.'

        SET @begin = @begin + 1

END

答案 1 :(得分:1)

您确定需要创建具有完全相同结构的30个表吗?你能详细说明你想做什么吗?这似乎是一个潜在的数据库或应用程序设计问题,除非您要创建某种需要设置初始数据库的应用程序安装程序,否则很可能有更好的方法来完成您正在执行的操作。

即使事实证明创建30个表确实是解决问题的最佳方法,但应用/业务逻辑而不是SQL可能会更好地处理这些问题。再次,取决于你想要做什么。

除了以上几点之外,在我看来,除了迭代30行之外,确实没有更好的方法来完成你所描述的(使用T-SQL)。

答案 2 :(得分:0)

您可以使用游标循环遍历证券表,然后使用动态sql创建表。循环是执行许多创建表的完全可接受的方式。没有真正的方法以面向集合的方式做到这一点,这是人们说避免游标的通常原因。

declare 
    @sql nvarchar(max),
    @pair sysname;

declare securities_cursor cursor local fast_forward for
select PairName from Securities;

open securities_cursor;

fetch next from securities_cursor into @pair;

while @@fetch_status = 0
begin
    set @sql = '
    Create Table dbo.' + quotename(@pair) + ' (
        datekey datetime2(0) not null constraint ' + quotename('PK_' + @pair) + ' primary key,
        column1 decimal(10, 5),
        column2 decimal(10, 5),
        column3 decimal(10, 5),
        column4 decimal(10, 5),
        column5 decimal(10, 5) -- etc
    );'
    exec sp_executesql @sql;

    fetch next from securities_cursor into @pair;
end

close securities_cursor;
deallocate securities_cursor;