#sql #sql-server #sql-server-2008-r2
#sql #sql-сервер #sql-server-2008-r2
Вопрос:
Я хотел бы знать, есть ли решение для создания новой таблицы во многих базах данных, зависит от их имени.
Я использую SQL Server 2008 R2.
Вот мой скрипт для создания новой таблицы :
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[E_Invent2](
[D_No] [smallint] NOT NULL,
[Mo_Droits] [nvarchar](1) NOT NULL,
[Pr_Code] [nvarchar](10) NOT NULL,
[Pr_Libellé] [nvarchar](50) NULL,
[In_Stk08] [real] NULL,
[In_Stk09] [real] NULL,
[In_Stk10] [real] NULL,
[In_Stk11] [real] NULL,
[In_Stk12] [real] NULL,
[In_Stk01] [real] NULL,
[In_Stk02] [real] NULL,
[In_Stk03] [real] NULL,
[In_Stk04] [real] NULL,
[In_Stk05] [real] NULL,
[In_Stk06] [real] NULL,
[In_Stk07] [real] NULL,
[In_StkMoy] [real] NULL,
[In_StkReel] [real] NULL,
[In_PrtConstElab] [real] NULL,
[In_TauxElab] [real] NULL,
[In_DeducAutoElab] [real] NULL,
[In_PrtTaxElab] [real] NULL,
[In_PrtConstEmbout] [real] NULL,
[In_VolEmbout] [real] NULL,
[In_TauxEmbout] [real] NULL,
[In_DeducAutoEmbout] [real] NULL,
[In_PrtTaxEmbout] [real] NULL,
[In_PrtTaxTotal] [real] NULL,
[In_ManquantTaxable] [real] NULL,
[In_TotalDroits] [real] NULL,
[D_Nom] [nchar](50) NULL,
[D_Enseigne] [nchar](30) NULL,
[D_Adr1] [nchar](30) NULL,
[D_Adr2] [nchar](30) NULL,
[D_Post] [nchar](10) NULL,
[D_Adr3] [nchar](30) NULL,
CONSTRAINT [PK_E_Invent2] PRIMARY KEY CLUSTERED
(
[D_No] ASC,
[Mo_Droits] ASC,
[Pr_Code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Я хотел бы выполнить это для всех баз данных, где имя базы данных начинается с CM_0.
Я нашел решение для удаления таблицы :
declare @sql varchar(8000)
set @sql=''
select @sql=@sql ' drop table ' table_name from INFORMATION_SCEHMA.TABLES where table_name like 'tmp_%'
exec(@sql)
Но командная строка ‘drop’ проще, чем командная строка ‘create’…
Кто-нибудь может мне помочь?
Заранее спасибо
Кукски
Ответ №1:
Есть лучший и более дешевый способ сделать это. Это очень-очень просто и отлично работает.
С помощью SELECT INTO
инструкции вы можете скопировать структуру таблицы, а также данные в другую таблицу в той же или внешних базах данных.
Ссылка:http://www.w3schools.com/sql/sql_select_into.asp
DECLARE @sql VARCHAR(8000)
SET @sql=''
SELECT @sql=@sql '; SELECT * INTO ' name '.dbo.E_Invent2 FROM OriginalDB.dbo.E_Invent2' FROM sysdatabases WHERE name LIKE 'CM_0%' and name<>'OriginalDB'
SELECT @sql
EXEC(@sql)
Здесь OrigialDB
указано имя базы данных, в которой у вас есть эта таблица.
Если ваша таблица в OrginalDB
содержит данные, и вы не хотите копировать данные, а вам нужно скопировать только структуру, вы можете попробовать это-
DECLARE @sql VARCHAR(8000)
SET @sql=''
SELECT @sql=@sql '; SELECT * INTO ' name '.dbo.E_Invent2 FROM OriginalDB.dbo.E_Invent2 WHERE 1<>1' FROM sysdatabases WHERE name LIKE 'CM_0%' and name<>'OriginalDB'
SELECT @sql
EXEC(@sql)
Это должно сработать, иначе дайте мне знать, если я смогу вам помочь.
ПРИМЕЧАНИЕ: Ограничения не будут скопированы
Комментарии:
1. Метод, которым вы со мной поделились, предназначен только для инструкции select, не для инструкции create table, не так ли?
2. Нет, это не просто
select
инструкция, скорее этоSELECT INTO
инструкция, которая копирует данные из одной таблицы в другую таблицу (внешнюю базу данных) вместе со структурой таблицы.3. Вы гениальны 😉 ! Это очень сложно и так хорошо. Большое вам спасибо!
4. ПРИМЕЧАНИЕ: Мне нужно было добавить [] вокруг моей базы данных из-за «-» в имени базы данных.
Ответ №2:
Пожалуйста, проверьте это:
Declare @Sql nvarchar(max) = ''
Declare @tablename nvarchar(max) = 'MyTab'
Declare @PreSyntax nvarchar(max) = 'SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE '
Declare @PostSyntax nvarchar(max) = '(
[D_No] [smallint] NOT NULL,
[Mo_Droits] [nvarchar](1) NOT NULL,
[Pr_Code] [nvarchar](10) NOT NULL,
[Pr_Libellé] [nvarchar](50) NULL,
[In_Stk08] [real] NULL,
[In_Stk09] [real] NULL,
[In_Stk10] [real] NULL,
[In_Stk11] [real] NULL,
[In_Stk12] [real] NULL,
[In_Stk01] [real] NULL,
[In_Stk02] [real] NULL,
[In_Stk03] [real] NULL,
[In_Stk04] [real] NULL,
[In_Stk05] [real] NULL,
[In_Stk06] [real] NULL,
[In_Stk07] [real] NULL,
[In_StkMoy] [real] NULL,
[In_StkReel] [real] NULL,
[In_PrtConstElab] [real] NULL,
[In_TauxElab] [real] NULL,
[In_DeducAutoElab] [real] NULL,
[In_PrtTaxElab] [real] NULL,
[In_PrtConstEmbout] [real] NULL,
[In_VolEmbout] [real] NULL,
[In_TauxEmbout] [real] NULL,
[In_DeducAutoEmbout] [real] NULL,
[In_PrtTaxEmbout] [real] NULL,
[In_PrtTaxTotal] [real] NULL,
[In_ManquantTaxable] [real] NULL,
[In_TotalDroits] [real] NULL,
[D_Nom] [nchar](50) NULL,
[D_Enseigne] [nchar](30) NULL,
[D_Adr1] [nchar](30) NULL,
[D_Adr2] [nchar](30) NULL,
[D_Post] [nchar](10) NULL,
[D_Adr3] [nchar](30) NULL,
CONSTRAINT [PK_E_Invent2] PRIMARY KEY CLUSTERED
(
[D_No] ASC,
[Mo_Droits] ASC,
[Pr_Code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]'
Select @Sql = @Sql char(10) @PreSyntax isnull(name,'') '.dbo.' @tablename @PostSyntax char(10)
from sys.sysdatabases d
where d.name like '%pattern%'
Select @Sql
Комментарии:
1. Спасибо вам, это тоже работает, но метод Сувенду Шекхар Гири очень прост, вы должны взглянуть на него, это очень сложно 😉
2. Решение Suvendu будет работать только в том случае, если таблица уже существует в одной из баз данных. Если вы хотите создать новую таблицу в нескольких базах данных, вы должны предоставить схему.
3. Вы абсолютно правы. В моем случае я уже получаю скрипт для первой базы данных. Я запустил ее. И после того, как я скопировал ее в свои 450 других баз данных. Я был очень впечатлен быстрым. Другой недостаток: SELECT INTO не копирует ограничения, ключи или вычисляемые столбцы. Он также не копирует индексы. Но в моем случае меня это не беспокоило 🙂