2013-11-16 4 views
0

Я новичок в T-SQL, поэтому имею нулевые знания & am using SQL Server 2012. В настоящее время у меня есть таблица с именем dbo.Securities, которая содержит два столбца. Одна колонка называется PairName (nchar(15)) & другая колонка называется RunPair (bit). Эта таблица содержит 30 строк.T-SQL Создание новых таблиц на основе другой таблицы

Что я хотел бы сделать, это создать 30 новых таблиц, которые имеют одинаковую структуру. Структура представляет собой один столбец типа datetime, который будет основным ключом & должен опускаться ко второму. Есть еще 12 столбцов всех типов decimal(5,5).

30 таблиц будут названы в честь столбца PairName в таблице dbo.Securities. Я пытаюсь найти, как пройти через таблицу dbo.Securities, и использовать PairName для создания новой таблицы на основе упомянутой выше структуры.

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

+1

'decimal (5,5)' - вы ** действительно ** хотите десятичную цифру, которая состоит из 5 цифр (это первая «5»), из которых 5 после десятичной точки (это вторая «5» ')? (таким образом, оставляя ** никаких цифр ** до десятичной точки) [читайте о десятичном типе данных здесь] (http://msdn.microsoft.com/en-us/library/ms187746.aspx) - если вы хотите 5 цифр до и 5 цифр после десятичной точки, вы должны использовать 'decimal (10,5)' вместо этого! –

+0

Спасибо marc_s - да, вы правы, что должно быть десятичным (10,5) – mHelpMe

+0

Я стараюсь не задавать такие вопросы, как обычно ... Но зачем вам 30 таблиц с одинаковой структурой? С точки зрения дизайна базы данных вам, вероятно, будет лучше с одной таблицей - с столбцом типа, чтобы выделить 30 различных типов строк. Вы можете притворяться, что у вас есть 30 разных таблиц (если кто-то настаивает на этом), имея 30 просмотров - фильтруется по типу ... Просто идея ... – dav1dsm1th

ответ

0

Вы можете сделать это, указав курсор на таблицу ценных бумаг, а затем динамический sql для создания таблиц. Looping - вполне приемлемый способ выполнить несколько таблиц создания. Нет никакого реального способа сделать это целым ориентированным способом, который обычно является причиной того, что люди избегают курсоров.

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; 
1

Обратите внимание, что вы хотите отредактировать часть схемы таблицы в приведенном ниже коде. Этот цикл построит тридцать таблиц. Насколько лучший и быстрый подход? Используя 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

Вы уверены, что вам нужно создать 30 столов с одинаковой структурой? Можете ли вы рассказать о том, что вы пытаетесь сделать? Это похоже на потенциальную проблему с базой данных или дизайном приложения, и, если вы не создаете какой-либо установщик приложений, который должен настроить исходную базу данных, вполне вероятно, что это лучший способ выполнить то, что вы делаете.

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

Помимо вышеперечисленных пунктов, мне кажется, что нет лучших способов сделать то, что вы описали (используя T-SQL) выше, чем итерацию по 30 строкам.

+0

Причина, по которой у меня 30 таблиц, заключается в том, что у меня есть 30 разных ценных бумаг (валютные пары, например, EURUSD, GBPUSD и т. Д.). Каждая таблица в настоящее время имеет около 3 миллионов строк. Я думал, что создание таблицы для каждой безопасности будет лучше, чем одна таблица, содержащая 90 миллионов строк, когда дело доходит до запроса таблицы. Это неправильно? – mHelpMe

+0

Интересно! Помимо моего paygrade, также. , , но мне хотелось бы услышать от некоторых реальных dba, как это наиболее эффективно выполняется. Почти звучит как работа за некоторый вкус базы данных NoSQL. – XIVSolutions

Смежные вопросы