-
В программе 1. вычисляется что надо запустить, какую хранимку. 2. Любая хранимка возвращает обязательно только 1 набор данных (в т.ч. м.б. пустой)
Как определить тип столбцов, возвращаемого НД?
время работы не критично --
что подумал: - выполнить, да посмотреть что получилось 1 insert into #T1 exec Proc1 но не проходит, так можно только если вначале написать create table #T1 (С1 int, и т.п. ) но это то и надо получить :)
2 можно сделать select * into #T1 from OPEN_QUERY(link_srv, 'exec Proc1')
проблема: link_srv - сам этот сервер. Как можно обратится сам к себе через OPEN_QUERY, не юзая sp_add_linked_server?
3 ?
-
да, почему все в таблицу пытаюсь засунуть - потом через информационную схему прочитать хочу. Желательно получить именно так, как сервер сам говорит про типы.
Из программы тип поля dataset прочитать можно, но delphi некоторые типы "не оригинально" называет. А требуются именно типы.
-
так тоже никак
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=db-3;Trusted_Connection=yes;', --'select top 10 * from Table') -- так работает 'exec proc1') -- так нет
-
> 'exec proc1') -- так нет
т.е. "the object has no columns or the current user does not have permissions on that object." а т.к. current user в группе админов, то опа..
-
снимается.. все работает
> 2. Любая хранимка возвращает обязательно только 1 набор > данных (в т.ч. м.б. пустой) >
надо же.. именно такие и были а т.к. >> OpenQuery requires a result set to be returned то и вот так
-
хотя в целом вопрос актуален. т.е. как по имени хранимки получить тип столбцов возвращаемой таблицы
-
> т.е. как по имени хранимки получить тип столбцов возвращаемой таблицы одна и та же процедура в зависимости от каких то условий может возвращать разные таблицы... или не возвращать ни одной, или несколько.
-
одна и та же процедура возвращает одно и то же, в смысле, одну и ту же таблицу. Или ничего. несколько рекордсетов не может быть
-
так достать параметры SELECT
[Name] = N'@RETURN_VALUE',
[ID] = 0,
[Direction] = 6,
[UserType] = NULL,
[SystemType] = N'int',
[Size] = 4,
[Precision] = 10,
[Scale] = 0
WHERE
OBJECTPROPERTY(OBJECT_ID(N'<sp_name>'), 'IsProcedure') = 1
UNION
SELECT
[Name] = CASE WHEN p.name <> '' THEN p.name ELSE '@RETURN_VALUE' END,
[ID] = p.parameter_id,
[Direction] = CASE WHEN p.is_output = 0 THEN 1 WHEN p.parameter_id > 0 AND p.is_output = 1 THEN 3 ELSE 6 END,
[UserType] = CASE WHEN ut.is_assembly_type = 1 THEN SCHEMA_NAME(ut.schema_id) + '.' + ut.name ELSE NULL END,
[SystemType] = CASE WHEN ut.is_assembly_type = 0 AND ut.user_type_id = ut.system_type_id THEN ut.name WHEN ut.is_user_defined = 1 OR ut.is_assembly_type = 0 THEN st.name WHEN ut.is_table_type =1 Then 'STRUCTURED' ELSE 'UDT' END,
[Size] = CONVERT(int, CASE WHEN st.name IN (N'text', N'ntext', N'image') AND p.max_length = 16 THEN -1 WHEN st.name IN (N'nchar', N'nvarchar', N'sysname') AND p.max_length >= 0 THEN p.max_length/2 ELSE p.max_length END),
[Precision] = p.precision,
[Scale] = p.scale
FROM
sys.all_parameters p
INNER JOIN sys.types ut ON p.user_type_id = ut.user_type_id
LEFT OUTER JOIN sys.types st ON ut.system_type_id = st.user_type_id AND ut.system_type_id = st.system_type_id
WHERE
object_id = OBJECT_ID(<sp_name>')
ORDER BY
2 потом выполнить проседуру, на ошибки не смотреть, если должен быть рекодсет то он придет, хоть и пустой
-
1. достать проще (и изящнее) так: select [param] = c.name, [type] = t.name, [length] = c.length, @ProcName from syscolumns c join sysobjects o on o.id = c.id join systypes t on t.xtype = c.xtype where o.name = @ProcName
2. прочитать внимательно что мне надо
-
так достают дизайнеры вижуал студии
|