Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-81450
MaximatorVeter
2002-06-27 22:15
2002.07.25
Нотация и семантика.


3-81153
Фикус
2002-07-04 08:26
2002.07.25
Backup - Restore командной строкой


8-81376
Dest
2002-03-19 15:27
2002.07.25
Загрузить курсор из TStream


7-81490
Glonia Zbanov
2002-05-07 13:00
2002.07.25
принтеры


14-81459
Pro
2002-06-28 09:50
2002.07.25
редактор hlp





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский