Отображение типа данных и размера столбца из результатов запроса SQL Server во время выполнения - PullRequest
9 голосов
/ 22 июня 2009

Есть ли способ выполнить запрос, а затем попросить среду управления SQL Server или sqlcmd или что-нибудь просто отобразить тип данных и размер каждого столбца в том виде, в котором он был получен.

Похоже, эта информация должна присутствовать для передачи данных между сервером и клиентом. Для меня было бы очень полезно, если бы это могло быть отображено.

Немного фона: Причина, по которой я спрашиваю, заключается в том, что я должен взаимодействовать с бесчисленными устаревшими хранимыми процедурами с количеством строк от 50 до 5000+ каждая. Я не хочу пытаться проследить поток загадочной логики в и из временных таблиц, в другие процедуры, в конкатенацию строки eval и так далее. Я не хочу ничего знать о реализации, просто что ожидать, когда они работают. К сожалению, следование логическому потоку, похоже, является единственным способом выяснить, что именно возвращается, не пытаясь определить, какие именно типы представлений строк данных, например, из студии управления или из собственного типа в .net.

Чтобы уточнить: Я не спрашиваю о том, как определить типы таблиц или что-то подобное. Я уверен, что что-то вроде sp_help мне не поможет. Я спрашиваю, как определить тип сервера sql (т.е. varchar (25), int ...) из того, что мне дали. Кроме того, изменение реализации sprocs невозможно, поэтому учтите это в своих решениях. Я действительно надеюсь, что есть команда, которую я где-то пропустил. Большое спасибо всем.

Обновление Я предполагаю, что я действительно спрашиваю, как получить схему набора результатов, когда набор результатов исходит из запроса с использованием временной таблицы. Я понимаю, что это невозможно, но не вижу особого смысла в таком заключении, потому что данные передаются в конце концов. Вот пример хранимой процедуры, которая может вызвать проблемы.

CREATE PROCEDURE [dbo].[IReturnATempTable]
AS

Create table #TempTable 
( 
    MyMysteryColumn char(50)
)

INSERT #TempTable (
    MyMysteryColumn
) VALUES ( 
    'Do you know me?' ) 


select TOP 50 * FROM #TempTable 

Ответы [ 6 ]

2 голосов
/ 22 июня 2009

Немного далеко, попробуйте поиграться с SET FMTONLY ON (или выключено). Согласно BOL, это «возвращает клиенту только метаданные. Может использоваться для проверки формата ответа без фактического выполнения запроса». Я подозреваю, что это будет включать в себя то, что вы ищете, так как BCP использует это. (Я наткнулся на эту настройку при отладке некоторых очень странных проблем BCP.)

2 голосов
/ 22 июня 2009

Что вы будете делать с хранимыми процедурами, которые возвращают разные наборы результатов на основе своих параметров?

В любом случае вы можете настроить SqlDataAdapter.SelectCommand вместе с необходимыми параметрами, а затем вызвать метод FillSchema. Предполагая, что схема может быть определена, вы получите таблицу данных, настроенную с правильными именами и типами столбцов и некоторыми ограничениями.

1 голос
/ 22 июня 2009

Не могли бы вы добавить еще один выбор к вашей процедуре?

Если это так, вы можете сделать это с помощью функции sql_variant_property .

Declare @Param Int
Set @Param = 30

Select sql_variant_property(@Param, 'BaseType')
Select sql_variant_property(@Param, 'Precision')
Select sql_variant_property(@Param, 'Scale')

Я написал это на этом вопросе.

Я спрашиваю, как сказать, что такое sql типы серверов (т.е. varchar (25), int ...) имеют то, что мне дали

Затем вы можете распечатать тип, точность (то есть 25, если это VarChar (25)), и масштаб параметра.

Надеюсь, это поможет ... :)

0 голосов
/ 20 июня 2018

Я знаю, что это старый вопрос, я нашел его по ссылке из SqlDataAdapter.FillSchema с хранимой процедурой, имеющей временную таблицу . К сожалению, ни на один вопрос не было принято ответа, и ни один из предложенных ответов не смог решить мою проблему.

Для краткости, если вы используете SQL Server 2012 или новее, в большинстве случаев будут работать следующие встроенные функции:

Однако в некоторых случаях эти функции не обеспечивают полезного вывода. В моем случае проблема была больше похожа на вопрос, связанный выше, и, следовательно, я считаю, что на решение более уместно ответить по этому вопросу. Мой ответ можно найти здесь .

0 голосов
/ 29 апреля 2015

Этот код должен исправить вас. Возвращает только набор данных схемы без записей. Этот набор данных можно использовать для запроса типа данных столбца и любых других метаданных. Позже, если хотите, вы можете заполнить DataSet записями, создав SqlDataAdapter и вызвав его метод Fill (IDataAdapter.Fill).

private static DataSet FillSchema(SqlConnection conn)
{
    DataSet ds = new DataSet();
    using (SqlCommand formatCommand = new SqlCommand("SET FMTONLY ON;", conn))
    {
        formatCommand.ExecuteNonQuery();
        SqlDataAdapter formatAdapter = new SqlDataAdapter(formatCommand);
        formatAdapter.FillSchema(ds, SchemaType.Source);
        formatCommand.CommandText = "SET FMTONLY OFF;";
        formatCommand.ExecuteNonQuery();
        formatAdapter.Dispose();
    }
    return ds;
}
0 голосов
/ 23 июня 2009

Если вы не ограничены T-SQL, и, очевидно, вы не против запустить SP (потому что SET FMTONLY ON не совсем надежен), вы определенно МОЖЕТЕ вызвать SP от, скажем, C #, используя SqlDataReader. Затем проверьте SqlDataReader, чтобы получить столбцы и типы данных. У вас также может быть несколько наборов результатов, вы также можете легко перейти к следующему набору результатов из этой среды.

...