Программно получите источник хранимой процедуры SQL Server, который идентичен источнику, возвращенному Studio управления SQL Server gui?

64
задан MackM 23 February 2018 в 15:57
поделиться

7 ответов

EXEC sp_helptext 'your procedure name';

Это избегает проблемы с подходом INFORMATION_SCHEMA, где хранимая процедура отключена, если это слишком длинно.

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

Обновление 2: Это предоставит источнику "CREATE PROCEDURE", а не "ALTER PROCEDURE", но я не знаю ни о каком способе сделать, он использовать "ИЗМЕНЯЕТСЯ" вместо этого. Своего рода тривиальная вещь, тем не менее, не так ли?

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

81
ответ дан Gudradain 24 November 2019 в 15:50
поделиться

Необходимо будет вручить код это, 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, его более простым...

15
ответ дан Sam Saffron 24 November 2019 в 15:50
поделиться

Используйте следующий избранный оператор для получения всего целого определения:

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

мое предположение - то, что SSMS и другие инструменты считывают это и вносят изменения, в случае необходимости, такие как изменение СОЗДАЮТ для ИЗМЕНЕНИЯ. Насколько я знаю, что SQL хранит не другие представления процедуры

7
ответ дан Milana 24 November 2019 в 15:50
поделиться

Я соглашаюсь с Mark. Я установил вывод на текстовый режим и затем sp_HelpText 'sproc'. У меня есть обязанный с Crtl-F1 облегчить.

5
ответ дан BankZ 24 November 2019 в 15:50
поделиться

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

4
ответ дан Chris Nava 24 November 2019 в 15:50
поделиться

Вы сказали программно, верно? Надеюсь, 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;
11
ответ дан 24 November 2019 в 15:50
поделиться

Чтобы изменить хранимую процедуру, вот код 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();

Вещи, на которые следует обратить внимание:

  1. Убедитесь, что USER в строке подключения имеет право изменять SP
  2. Удалите все GO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER утверждения из файла сценария. (Если этого не сделать, SqlCommand выдаст ошибку).
-2
ответ дан 24 November 2019 в 15:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: