операторы из файла сценария. (Если вы этого не сделаете, SqlCommand выдаст ошибку).

указатели на то, как я могу программно получить точно такой же источник хранимой процедуры из SQL Server 2005, как когда я щелкаю правой кнопкой мыши по этой хранимой процедуре в SQL Server Management Studio и выбираю изменить?

Я пытаюсь использовать SMO, но есть некоторые текстовые различия. В процедуре всегда есть CREATE, а не ALTER, и в заголовке есть некоторые различия, такие как отсутствие GO в версии, которую я получаю программно. Я могу исправить это, но, возможно, есть лучший способ?

Опять же, я в SQL Server 2005, используя SMSE. Использование SMO через Visual Studio 8 2008.

Обновить: Получил несколько ответов, которые рассказывают основы того, как извлечь хранимую процедуру. То, что я ищу, - это получение текста, идентичного (или почти идентичного) тому, что генерирует графический интерфейс.

Пример: для sp_mysp щелкните правой кнопкой мыши в Management Studio и выберите изменить. Это создает:

    USE [MY_DB]  
    GO  
    /****** Object:  StoredProcedure [dbo].[sp_mysp]    Script Date: 01/21/2009 17:43:18 ******/  
    SET ANSI_NULLS ON  
    GO  
    SET QUOTED_IDENTIFIER ON  
    GO  
    -- =============================================
    -- Author:      
    -- Create date: 
    -- Description: 
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_mysp]

Я хотел бы получить то же самое программно (обратите внимание на GO в заголовке и тот факт, что это ALTER PROCEDURE. В идеале, я хотел бы получить это с минимальным программным исправлением полученного источника.

Я был бы счастлив получить только то, что отличалось в деталях «Дата сценария». , ,

 Mark Brittingham22 янв. 2009 г., 05:53
Ах да - и проверьте мастер публикации баз данных MS. Это особенно полезно, если у вас есть некоторая «основная» информация в вашей БД, которую вы также хотите сохранить!
 Mark Brittingham22 янв. 2009 г., 05:52
Добро пожаловать и спасибо за выбор моего ответа в качестве ответ. Кстати, у меня был такой же опыт здесь на SO - я задаю вопрос и в итоге не получаю ответа, а вместо этого, решаю пойти другим путем.
 Mark Brittingham22 янв. 2009 г., 04:36
Если вас интересует ввод результатов в систему контроля версий, мне кажется, что единственным реальным ограничением является то, что они должны быть одинаковыми каждый раз, когда они генерируются с одинаковыми ветвями. Почему желание сохранять вещи похожими на сгенерированный интерфейс?
 DWright22 янв. 2009 г., 05:11
Хороший вопрос. У меня есть целая куча sps, которые были первоначально получены путем сохранения из графического интерфейса. Я просто должен изменить их. Я подумал, что если есть какой-то хук для получения того же вывода, что и графический интерфейс, почему бы не пойти с этим, но похоже, что это sp_helptext или smo (cur. Mthd). Спасибо!

Ответы на вопрос(8)

верно? Я надеюсь, что C # в порядке. Я знаю, что вы сказали, что пытались использовать SMO, и она не вполне выполняла то, что вы хотели, поэтому, вероятно, это не будет идеально для вашего запроса, но она будет программно считывать допустимые операторы SQL, которые вы можете запустить, чтобы воссоздать хранимую процедуру. Если у него нетGO заявления, которые вы хотите, вы можете предположить, что каждая из строк вStringCollection может иметьGO после этого. Вы можете не получить этот комментарий с указанием даты и времени, но в моем аналогичном проекте (инструмент развертывания с большой задницей, который должен резервировать все по отдельности), это было сделано довольно хорошо. Если у вас есть предыдущая база, с которой вы хотели работать, и у вас все еще есть исходная база данных, на которой она будет работать, я бы рекомендовал отбросить первоначальные усилия и пересмотреть эти выходные данные.

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
…
string connectionString = … /* some connection string */;
ServerConnection sc = new ServerConnection(connectionString);
Server s = new Server(connection);
Database db = new Database(s, … /* database name */);
StoredProcedure sp = new StoredProcedure(db, … /* stored procedure name */);
StringCollection statements = sp.Script;
Решение Вопроса
EXEC sp_helptext 'your procedure name';

в котором хранимая процедура обрезается, если она слишком длинная.

Обновление: Дэвид пишет, что это не идентично его sproc ... возможно, потому что он возвращает строки как «записи», чтобы сохранить форматирование? Если вы хотите увидеть результаты в более «естественном» формате, вы можете сначала использовать Ctrl-T (вывод в виде текста), и он должен распечатать его точно так, как вы его ввели. Если вы делаете это в коде, тривиально будет сделать foreach, чтобы собрать ваши результаты точно таким же образом.

Обновление 2: Это обеспечит источник «CREATE PROCEDURE», а не «ALTER PROCEDURE», но я не знаю способа заставить его использовать «ALTER». Впрочем, это довольно тривиальная вещь, не правда ли?

Обновление 3: см. Комментарии для получения дополнительной информации о том, как поддерживать ваш SQL DDL (структуру базы данных) в системе контроля версий. Это действительно ключ к этому вопросу.

 DWright22 янв. 2009 г., 00:34
Полезный, но не идентичный источник.
 DWright22 янв. 2009 г., 00:55
Правда, довольно тривиально. Я пытаюсь найти простой способ поместить прокси-серверы SQL Server Express во внешний элемент управления исходным кодом и сравнить текущие процессы (в БД) с этим элементом управления исходным кодом - вот почему было бы неплохо всегда получать именно тот же источник, что и графический интерфейс, генерируемый через модификацию.
 Mark Brittingham22 янв. 2009 г., 03:50
На самом деле, хранимый процесс для генерации всего этого автоматически будет довольно тривиальным. Наведите курсор на sys.objects, где type = 'P', чтобы получить все sprocs, отправьте каждое в sp_HelpText, а затем наведите курсор на результаты с выключенным ALTER. Генерация вывода с печатью, сохранение в файл. Отправить в SVN
 Mark Brittingham22 янв. 2009 г., 03:53
Это даст вам один и тот же вывод каждый раз, чтобы его можно было использовать в системе управления версиями (например, SVN). Другая вещь, которую вы можете сделать, это использовать мастер публикации баз данных Microsoft SQL Server (google it) для генерациивсе Структура вашей базы данных и представить его в SVN.

чтобы получить все определение целиком:

select ROUTINE_DEFINITION from INFORMATION_SCHEMA.ROUTINES Where ROUTINE_NAME='someprocname'

я предполагаю, что SSMS и другие инструменты считывают это и вносят изменения, где это необходимо, например, изменяя CREATE на ALTER Насколько я знаю, SQL хранит не другие представления процедуры

 DWright22 янв. 2009 г., 00:32
Это, безусловно, помогает получить основное тело хранимой процедуры (хотя с таким же успехом можно использовать sp_helptext). Однако это не идентично тому, что производит GUI, когда я щелкаю правой кнопкой мыши по процедуре и выбираю модифицировать. Спасибо хоть.
 ivan_pozdeev24 апр. 2013 г., 15:15
2DWright: на самом деле, это графический интерфейс, который имеет недостатки и не показывает точный источник (например, номера строк прикручены).
 BuddyJoe22 янв. 2009 г., 00:37
DWright, Можете ли вы опубликовать небольшой образец того, что он меняет? Например, вы можете составить прок, который бьет по образцу Northwind. Затем опубликуйте два источника.
 Cade Roux22 янв. 2009 г., 00:36
Это также будет обрезано, если код длинный.

SMSE выполняет довольно длинную строку запросов, когда генерирует оператор.

Следующий запрос (или что-то в этом роде) используется для извлечения текста:

SELECT
NULL AS [Text],
ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
WHERE
(sp.type = N'P' OR sp.type = N'RF' OR sp.type='PC')and(sp.name=N'#test___________________________________________________________________________________________________________________00003EE1' and SCHEMA_NAME(sp.schema_id)=N'dbo')

Он возвращает чистый CREATE, который затем где-то подставляется в код ALTER.

К этому добавляются элементы SET ANSI NULL, а также операторы и даты GO.

Перейти с sp_helptext, это проще ...

Мастер публикации данных может вывести схему (и другие объекты) из командной строки.

SqlConnection con = new SqlConnection("your connection string");
con.Open();
cmd.CommandType = System.Data.CommandType.Text;
string sql = File.ReadAllText(YUOR_SP_SCRIPT_FILENAME);
cmd.CommandText = sql;   
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();

Что следует отметить:

Убедитесь, что пользователь в строке подключения имеет право изменить SPУдалить всеGO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER операторы из файла сценария. (Если вы этого не сделаете, SqlCommand выдаст ошибку).

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

IF exists (SELECT * FROM sys.objects 
        WHERE object_id = OBJECT_ID(N'sp_name')
            and type in ('P','V') --procedure or view
        )
    DROP sp_name
GO

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

Или ленивый подход:

IF OBJECT_ID(N'sp_name') is not null
    DROP sp_name
GO
 siride31 июл. 2013 г., 21:02
Опасность заключается в том, что если последующее создание не удастся, вы потеряли процедуру.

lpText 'sproc'. Я связал это с Crtl-F1, чтобы было проще.

 Max Hodges20 сент. 2012 г., 19:53
@BankZ как вы связываете это с Ctrl-F1 ??

Ваш ответ на вопрос