2013-06-24 2 views
5

В SQL Server 2008 R2 пользователь может создать таблицу с данными, щелкнув правой кнопкой мыши по базе данных, выбрав Tasks и Generate Scripts. Появится мастер, который попросит пользователей, что они хотят (несколько таблиц, одна таблица и т. Д.) Вместе с некоторыми дополнительными параметрами (которые позволяют пользователю получить как схему таблицы, так и данные); для вопросов, see this useful post of what's being done (под «The Handy»).Таблица сценариев с данными из кода

К сожалению, SQL Server не имеет сценария для генерации этих сценариев, и иногда нам приходится записывать скрипты из нескольких таблиц со всеми данными в них. Вместо того, чтобы вручную делать это каждый раз, я думал, что было бы проще, если бы приложение C# вызывало эти процессы для тестовой таблицы и генерировало скрипт для таблицы со всеми данными, сохраняя его как локальный файл.

Когда я использую SqlConnection, я не вижу возможности выполнить этот тип задачи (хотя это может быть с чем-то еще). Как этот мастер доступен?

Обновление: После первоначального ответа я предположил, что это невозможно, поэтому я разработал интересное решение для тех, кто более знаком с TSQL. Я создал хранимую процедуру, аналогичную приведенной ниже:

CREATE PROCEDURE usp_ScriptTableAndData 
AS 
BEGIN 

    CREATE TABLE ScriptTemp(
     Value VARCHAR(8000) 
    ) 

    INSERT INTO ScriptTemp 
    SELECT '/* Build the Reference Table */' 

    INSERT INTO ScriptTemp 
    SELECT 'USE [DB] 
     GO 

     SET ANSI_NULLS ON 
     GO 

     SET QUOTED_IDENTIFIER ON 
     GO 

     SET ANSI_PADDING ON 
     GO 

     CREATE TABLE [dbo].[Table](
      [ID] [int] IDENTITY(1,1) NOT NULL, 
      [Reference] [varchar](50) NULL, 
      [TableDate] [datetime] NOT NULL, 
      [Display] [bit] NULL 
     ) 

     SET ANSI_PADDING OFF 
     GO 


     INSERT INTO ScriptTemp 
     SELECT '/* Insert the Table Values */' 

     INSERT INTO ScriptTemp 
     SELECT 'INSERT INTO Table VALUES(' + CAST(ID AS VARCHAR(3)) + 
      ',' + '''' + LTRIM(RTRIM(ISNULL(Reference,'NULL'))) + '''' + 
      ',' + '''' + CONVERT(VARCHAR(25),TableDate,120) + '''' + 
      ',' + ISNULL(CAST(Display AS VARCHAR(4)),'NULL') + ')' 
     FROM dbo.Table 

     EXECUTE xp_cmdshell 'BCP "SELECT * FROM DB.dbo.ScriptTemp" queryout "\\FileSharePath\Script.sql" -T -c -SSERVER' 

     DROP TABLE ScriptTemp 
END 

Это создает сценарий с таблицей и данных (я получил идею от подобного сценария, Bill Fellows created). В любом случае, это решение также работает, и это очень удобно для людей, более знакомых с TSQL. Еще раз спасибо всем, кто ответил.

+3

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

3

Вы должны зарегистрироваться SQL Server Management Objects (SMO). Я использовал это для создания пользовательских сценариев в .NET-приложениях раньше, но я не уверен, поддерживает ли он скрипты данных.

Из MSDN:

управления SQL Server Objects (SMO) являются объекты, предназначенные для программного управления Microsoft SQL Server. Вы можете использовать SMO для создавать настраиваемые приложения для управления SQL Server.

+2

SMO поддерживает данные сценариев. См. Здесь пример: http://stackoverflow.com/questions/5365408/c-sharp-smo-scripting-table-data-to-file-throwing-error – RBarryYoung

+0

@ahkvk Спасибо, что ТОЧНО, что я искал - здорово! – Question3CPO

2

Мастер является функцией консоли управления SQL и доступен только оттуда. Он не является частью класса SqlConnection или любой части самой .NET Framework.

Это похоже на то, чтобы спросить, где находится диалог «Шрифты», когда вы создаете объект автоматизации Word в своем коде.

+0

Это часть SMO в .NET Framework. Вот как это делает SSMS (по большей части). – RBarryYoung

+0

@catfood Спасибо; перед другим ответом я предположил, что это невозможно, и потратил несколько часов на разработку своего собственного решения, что было сложным упражнением. – Question3CPO

+0

И я кое-что узнал о SMO. Спасибо, RBarryYoung. Извините, что вас вводит в заблуждение, Question3CPO. – catfood

0

Вы можете выполнить эту операцию с помощью SQL Server Management Studio. Щелкните правой кнопкой мыши по экземпляру базы данных -> Задача -> Сгенерировать скрипты -> Затем заполните вкладку «Введение» и «Заполнить объект» (в которой выберите таблицы, в которых вы хотите использовать сценарий данных) -> Теперь в разделе «Настройка сценария» -> Нажмите «Дополнительно», а затем «В общем разделе» - Установите тип данных в сценарий как данные только из схемы. Вы получите полный скрипт данных в качестве выбранного местоположения.

+1

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

1

Функциональность для скриптовых схем отсутствует в библиотеках sql, в библиотеках визуальных студий.

E.g. Microsoft.Data.Schema.ScriptDom.Sql, Microsoft.Data.Schema.ScriptDom;

Визуальная команда студии/парень по имени Герт Drapers http://blogs.msdn.com/b/gertd/ работал над чем-то под названием Visual Studio система команды издание базы данных 2008 - ее забыли о сейчас, но его все еще там спрятан в VS2010 и VS2012 Enterprise Edition (или то, что каждое его прямо сейчас называется). Вы получаете возможность сравнивать схему и данные из баз данных, как они это сделали? Microsoft написала набросок загрузок классов, которые вы можете использовать.

Есть много неиспользованных функциональных возможностей, конечно, это напрямую не отвечает на ваш вопрос (SMO), но, надеюсь, это дает вам представление о том, что его возможный и кто-то другой выполнил большую часть работы.

Вы видели SQLPackage.exe? Это все схемы и данные упакованы в zip-файл.