我是T-SQL的新手所以没有知识和知识。我正在使用SQL Server 2012.目前我有一个名为dbo.Securities
的表,其中包含两列。一列称为PairName
(nchar(15)
)&另一列称为RunPair
(bit
)。该表包含30行。
我想要做的是创建30个新表,它们都具有相同的结构。该结构是datetime
类型的一列,它将成为主键&必须要到第二个。还有12个其他列都属于decimal(5,5)
类型。
30个表格将以表格PairName
中的dbo.Securities
列命名。我一直试图找出如何循环遍历dbo.Securities
表,并使用PairName
基于上述结构创建一个新表。
然而,在阅读了一些指南之后,看起来循环通过表并不是尝试完成此任务的最佳方式。
答案 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;