Как создать новую таблицу, где имя базы данных начинается с …?

#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 не копирует ограничения, ключи или вычисляемые столбцы. Он также не копирует индексы. Но в моем случае меня это не беспокоило 🙂