Форум: "Базы";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];
ВнизТекст хранимой процедуры в MS SQL Найти похожие ветки
← →
ED_IV (2002-07-04 08:53) [0]Всем здравствуйте!
Пытаюсь прочитать тексты хранимых процедур следующим запросом.
SELECT syscomments.text SPText FROM sysobjects INNER JOIN syscomments ON
sysobjects.id = syscomments.id WHERE sysobjects.name = :SPName AND
sysobjects.xtype="P" AND sysobjects.name NOT LIKE "dt%"
Открываю Query - все ОК! И EOF"а нет! Но когда я пробую посмотреть поля в
TQuery (должно же быть поле SPText) - там пустой список... :( А в стандартном
ISQL от мелкософтов показывается все по-честному - поле SPText есть.
Кто сталкивался с такой проблемой? Сущестует ли какой-либо другой метод
почитать текст ХП?
Эд.
← →
MishGan (2002-07-04 09:29) [1]Попробуй немного изменить запрос:
SELECT cast(syscomments.text as varchar(8000)) SPText .....
и расскажи потом - помогло это или нет.
← →
Nikita (2002-07-04 10:22) [2]Попробуй так:
SELECT convert(varchar(255),SC.text) as SPText FROM sysobjects SO INNER JOIN syscomments SC ON
SO.id = SC.id WHERE SO.name = :SPName AND
SO.xtype="P" AND SO.name NOT LIKE "dt%"
← →
AlexSV (2002-07-04 10:54) [3]Точно то-же можно получить следующим образом: sp_helptext :SPName
Результат аналогичен.
Просто, если текст процедуры более 255 символов, то он разноситься на несколько строк.
MS у себя, наверное, сначала собирает из кусков, а потом показывает. Это и есть решение, ИМХО.
← →
Севостьянов Игорь (2002-07-04 13:01) [4]На Делфах я не делал (надо было на VB), но принцип думаю тот же
И получал весь текст вот код - если надо перевести на Делфи пиши на мыло ... (Я на VB этакий SQLNavigtor сделал - слегка похож на Enterprise Manager). Причем работает даже для MSSQL 6.0
Вот кусок кода извлекающий тело SP:
Private Sub LoadScript()
On Error GoTo ShowError
Dim strSQL As String
Dim ObjID As Variant
Dim NL As Variant
NL = NodeLevel(tvObjects.SelectedItem)
If (NL = 4) Or (NL = 6) Then
ObjID = -1
StatusMessage "Загружается скрип объекта..."
ObjID = ObjectId(tvObjects.SelectedItem)
If ObjID > -1 Then
strSQL = ""
strSQL = "SELECT text FROM "
strSQL = strSQL & NodeMultipleLevel(tvObjects.SelectedItem, NodeLevel(tvObjects.SelectedItem)) & "..syscomments WHERE id = "
strSQL = strSQL & ObjectId(tvObjects.SelectedItem)
With rs
.CursorLocation = adUseClient
.Open strSQL, Conn, adOpenDynamic, adLockOptimistic, adCmdText
txtScript.Text = ""
While Not .EOF
txtScript.Text = txtScript.Text & Replace(.Fields(0).OriginalValue, vbLf, vbNewLine)
.MoveNext
Wend
.Close
txtScript.Visible = True
StatusMessage ""
End With
End If
End If
ShowError: ShowErrors "LoadScript", Err
End Sub
Function ObjectId(nodeX As node) As String
On Error GoTo ShowError
Dim strSQL As String
strSQL = ""
strSQL = strSQL & "SELECT id FROM "
strSQL = strSQL & NodeMultipleLevel(nodeX, NodeLevel(nodeX)) & "..sysobjects WHERE name = "" & nodeX & """
With rs
If .State = adStateOpen Then .Close
.CursorLocation = adUseClient
.Open strSQL, Conn, adOpenDynamic, adLockOptimistic, adCmdText
If .RecordCount > 0 Then
ObjectId = .Fields(0).OriginalValue
End If
.Close
End With
ShowError: ShowErrors "ObjectId", Err
End Function
Ну а в общих чертах SQL таковой
SELECT text FROM master..syscomments WHERE id =
(SELECT id FROM master..sysobjects WHERE name = "sp_who2")
Да, и потом - пока не конец (EOF) добавляешь, например, в Memo
И не забудь о символах типа #13 (Enter) #10 (Tab) в конце строк (строка - запись в НД)
← →
TSV (2002-07-04 14:53) [5]> AlexSV (04.07.02 10:54)
Прежде чем написать свой пост, ты на структуру таблицы syscomments смотрел??? Там поле [text] nvarchar(4000) . Делай выводы...
А по поводу 255 символов - так это BDE больше не пропускает при Native Links.
← →
SergSuper (2002-07-04 15:49) [6]А может не изобретать велосипед и воспользоваться стандартной процедурой?
sp_helptext
Prints the text of a rule, a default, or an unencrypted stored procedure, user-defined function, trigger, or view.
← →
MishGan (2002-07-04 16:17) [7]2 SergSuper. Думаю, что использование sp_helptext данную проблему не решит, т.к. она также возвращает столбец типа nvarchar. А по ходу дела из за него то все и проблемы.
← →
Balu (2002-07-04 21:20) [8]Я это делал так:
uses ComObj;
..............
var
srvs, base, Proc: Variant;
i: Integer;
S: WideString;
.........................
srvs := CreateOleObject("SQLDMO.SQLServer");
srvs.Connect("Имя Сервера", "sa", "Пароль");
base := srvs.Databases.Item("Имя базы");
Proc := base.StoredProcedures.Item("Имя хранимой процедуры");
S := Proc.Text;
Memo1.Lines.Clear;
Memo1.Lines.Add(S);
.........................
← →
SergSuper (2002-07-05 10:05) [9]> MishGan
ну тогда так:
create table #t (txt varchar(255))
insert #t exec sp_helptext "some_proc"
select * from #t
← →
AlexSV (2002-07-05 10:55) [10]> TSV
А Вы собственно про какой MS SQL?
Поскольку версии не указано, то привожу описаное структуры из Book online
Column Datatype Description
...
text varchar(255) Actual text of the SQL definition statement.
Работаю на 6.5. Структуру смотрел, совпадает.
А вот так я получаю всю хранимую процедуру с версиями:
procedure TForm1.Button1Click(Sender: TObject);
var
SPText: TStrings;
begin
with Query1 do begin
Open;
SPText := TStringList.Create;
try
while not Eof do begin
SPText.Add(FieldValues["text"]);
Next;
end;
finally
Memo1.Lines.AddStrings(SPText);
SPText.Free;
First;
end;
end;
end;
При этом в Query1.SQL заведено sp_helptext <Имя_Хранимой_Процедуры>
← →
TSV (2002-07-05 12:03) [11]А я про версию 7 и 2000... ;-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c