Чудеса да и только!!!!

Alexey Vukolov
Дата: 07.03.2001 19:54:13
Все описанное ниже относится к MS SQL 7. Как в 2000 - не знаю.

В MS SQL вообще много странного непонятного. В том числе есть возможность процедурам прикидываться таблицами. В базе master есть группа таблиц, имена которых начинаются с SYSREMOTE_. Так вот, эти таблицы не настоящие, а попытка сделать select из них, например так:

select * from SYSREMOTE_CATALOGS

приводит к следующей ошибке:
Procedure 'SYSREMOTE_CATALOGS' expects parameter 'ServerName', which was not supplied.
И как Вам такое? Мало того есть специальная форма оператора select!!!
Вот и примерчик:

create procedure sp_catalogs( @server_name sysname)
as
select
CATALOG_NAME,
convert (nvarchar(255),DESCRIPTION)
from master.dbo.SYSREMOTE_CATALOGS < @server_name >
order by CATALOG_NAME

Обнаружено все это было чисто случайно. Документация "молчит как рыба об лед". Или я не нашел описания этих чудес...

Кто нибудь может это объяснить, ШО ЭТО ТАКОЕ?!!!
Дед Маздай
Дата: 11.03.2001 19:43:51
Многие знания влекут многие печали. Предположим, MSDE где-то внутри себя поддерживает некую разновидность persisted parameterized queries. Причем предположим также, что делалось это еще в те времена, когда в SQL Server'e не было понятия in-line table-valued function, поэтому снаружи это засвечено как sp, а не как, допустим, параметризованное представление. Я подчеркиваю, что все это догадки и проку от них чуть, п.ч. даже доскональное знание того, как на с.д. это устроено, не поможет сделать что-н. вроде select * from sp_who до выхода сл.версии.
Alexey Vukolov
Дата: 11.03.2001 22:01:25
В принципе, как SP эта скрытая не видна. Видна только таблица. Но вот при попытке сделать select нарываешься на процедуру. Скорее всего это реализовано как-нибудь по типу расширенных хранимых процедур. Да, еще в sysobjects в поле sysstat для всех этих псевдотаблиц стоит одно и то же значение = 1089. Ну, да хрен бы с ним. Могли бы все это дело хоть в документации прописать, что мол, так и так, есть системные таблицы, запросы к ним делать вот так. А еще лучше - как самому такое же сотворить. Ведь видно же, что можно. Однако ж - фигушки, как всегда у MS получается, что все звери равны, но некоторые равнее других.

К стати, в 6.x этого, вроде как, не было.
Дед Маздай
Дата: 12.03.2001 07:55:26
Потому что в 6.х не было прилинкованных серверов. А по поводу документации - MS всегда говорила: не привязывайтесь к системным объектам, т.к. даже чтение в случае изменения их стр-ры в след.версии (или даже в SP) сделает программу неработоспособной. Напр., чтобы посмотреть список всех БД на прилинкованном сервере лучше исп-ть уже процитированную sp_catalogs, нежели select * from sysremote_catalogs. Я, конечно, понимаю, что любому здравомыслящему человеку еще с детства хочется понять, как все устроено, поэтому желание разобрать игрушку, сделав sp_helptext, вполне оправдано. Но тогда не стоит упрекать MS в недокументированности того, чем пользоваться, в принципе, не предполагается.
Fompro
Дата: 12.03.2001 09:09:07
Весьма любопытен синтаксис запроса, p.e. в sp_calalogs:from master.dbo.SYSREMOTE_CATALOGS < @server_name >
Между тем, в скрипте oledbsch.sql ('CREATE OLE-DB SYSTEM VIEWS') я никаких странностей не увидел. ???
alexeyvg
Дата: 12.03.2001 15:31:09
To Дед Маздай: К сожалению, использование хранимых процедур так-же сделает программу неработоспособной. Например, в результате, выдаваемом sp_helpuser (для версии SQL 2000) мы недосчитаемся колонки SUserID.