Конференция "Базы" » mssql. Получить типы столбцов произвольной хранимки [MSSQL]
 
  • ВладОшин © (08.07.14 16:00) [0]
    В программе
    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
    ?
  • ВладОшин © (08.07.14 16:06) [1]
    да, почему все в таблицу пытаюсь засунуть - потом через информационную схему прочитать хочу. Желательно получить именно так, как сервер сам говорит про типы.

    Из программы тип поля dataset прочитать можно, но delphi некоторые типы "не оригинально"  называет. А требуются именно типы.
  • ВладОшин © (08.07.14 16:44) [2]
    так тоже никак

    SELECT
    *
    FROM
    OPENROWSET('SQLNCLI',
              'Server=db-3;Trusted_Connection=yes;',
              --'select top 10 * from Table') -- так работает
              'exec proc1') -- так нет
  • ВладОшин © (08.07.14 16:46) [3]

    >     'exec proc1') -- так нет


    т.е.  "the object has no columns or the current user does not have permissions on that object."
    а т.к.  current user в группе админов, то опа..
  • ВладОшин © (08.07.14 17:25) [4]
    снимается..
    все работает


    > 2. Любая хранимка возвращает обязательно только 1 набор
    > данных (в т.ч. м.б. пустой)
    >

    надо же.. именно такие и были
    а т.к.
    >> OpenQuery requires a result set to be returned
    то и вот так
  • ВладОшин © (08.07.14 17:37) [5]
    хотя в целом вопрос актуален.
    т.е. как по имени хранимки получить тип столбцов возвращаемой таблицы
  • sniknik © (08.07.14 18:32) [6]
    > т.е. как по имени хранимки получить тип столбцов возвращаемой таблицы
    одна и та же процедура в зависимости от каких то условий может возвращать разные таблицы... или не возвращать ни одной, или несколько.
  • ВладОшин © (08.07.14 20:25) [7]
    одна и та же процедура возвращает одно и то же, в смысле, одну и ту же таблицу. Или ничего.
    несколько рекордсетов не может быть
  • ухты (09.07.14 23:11) [8]
    так достать параметры

    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


    потом выполнить проседуру, на ошибки не смотреть, если должен быть рекодсет то он придет,  хоть и пустой
  • ВладОшин © (10.07.14 14:44) [9]
    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.
    прочитать внимательно что мне надо
  • ухты (10.07.14 18:17) [10]
    так достают дизайнеры вижуал студии
 
Конференция "Базы" » mssql. Получить типы столбцов произвольной хранимки [MSSQL]
Есть новые Нет новых   [134427   +34][b:0][p:0.002]