EXEC sp_helptext 'your procedure name';
Это избегает проблемы с подходом INFORMATION_SCHEMA, где хранимая процедура отключена, если это слишком длинно.
Обновление: David пишет, что это не идентично его sproc..., возможно, потому что он возвращает строки как 'записи' для сохранения форматирования? Если Вы хотите видеть результаты в более 'естественном' формате, можно использовать Ctrl-T сначала (вывод как текст), и это должно распечатать его точно, поскольку Вы ввели его. При выполнении этого в коде это тривиально, чтобы сделать foreach для соединения результатов точно таким же образом.
Обновление 2: Это предоставит источнику "CREATE PROCEDURE", а не "ALTER PROCEDURE", но я не знаю ни о каком способе сделать, он использовать "ИЗМЕНЯЕТСЯ" вместо этого. Своего рода тривиальная вещь, тем не менее, не так ли?
Обновление 3: См. комментарии еще для некоторого понимания о том, как поддержать Ваш DDL SQL (структура базы данных) в системе управления исходным кодом. Это - действительно ключ к этому вопросу.
Необходимо будет вручить код это, SQL Profiler показывает следующее.
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')
Это возвращается, чистые СОЗДАЮТ, с которым тогда заменяют, ИЗМЕНЯЮТСЯ в коде где-нибудь.
материал ПУСТОГО УКАЗАТЕЛЯ ANSI НАБОРА и операторы GO и даты все предварительно ожидаются к этому.
Идут с sp_helptext, его более простым...
Используйте следующий избранный оператор для получения всего целого определения:
select ROUTINE_DEFINITION from INFORMATION_SCHEMA.ROUTINES Where ROUTINE_NAME='someprocname'
мое предположение - то, что SSMS и другие инструменты считывают это и вносят изменения, в случае необходимости, такие как изменение СОЗДАЮТ для ИЗМЕНЕНИЯ. Насколько я знаю, что SQL хранит не другие представления процедуры
Я соглашаюсь с Mark. Я установил вывод на текстовый режим и затем sp_HelpText 'sproc'. У меня есть обязанный с Crtl-F1 облегчить.
Databse Публикация Мастера может вывести схему (и другие объекты) из командной строки.
Вы сказали программно, верно? Надеюсь, 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;
Чтобы изменить хранимую процедуру, вот код C#:
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();
Вещи, на которые следует обратить внимание:
GO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER
утверждения из файла сценария. (Если этого не сделать, SqlCommand выдаст ошибку).