9

有没有办法运行查询,然后让 SQL Server 管理工作室或 sqlcmd 或其他东西简单地显示接收到的每列的数据类型和大小。

似乎必须存在此信息才能在服务器和客户端之间进行数据传输。如果能显示出来对我很有帮助。

一点背景知识: 我问的原因是因为我必须与无数的遗留存储过程交互,每个存储过程都有 50 到 5000 多行代码。我不想尝试遵循进出临时表的神秘逻辑流程,进入其他过程,进入字符串连接的 eval 语句等等。我希望对实现不了解,只希望它们工作时会发生什么。不幸的是,遵循逻辑流程似乎是找出确切返回的内容的唯一方法,而无需尝试推断数据字符串表示的实际类型 om management studio studio 或 .net 中的本机类型。

澄清一下:我不是在问如何分辨表格的类型或类似的静态内容。我很确定像 sp_help 这样的东西不会帮助我。我在问如何判断我所获得的 sql 服务器类型(即 varchar(25)、int...)是什么。此外,无法更改存储过程的实现,因此请在您的解决方案中考虑这一点。我真的希望有一个我在某个地方错过的命令。非常感谢大家。

更新 我想我真正要问的是,当结果集源自使用临时表的查询时,如何获取结果集的架构。我理解这是不可能的,但对这个结论没有多大意义,因为数据毕竟是在传输的。下面是一个会导致问题的存储过程的示例。

CREATE PROCEDURE [dbo].[IReturnATempTable]
AS

Create table #TempTable 
( 
    MyMysteryColumn char(50)
)

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


select TOP 50 * FROM #TempTable 
4

6 回答 6

2

对于根据参数返回不同结果集的存储过程,您将如何处理?

在任何情况下,您都可以配置 SqlDataAdapter.SelectCommand 以及必要的参数,然后调用 FillSchema 方法。假设可以确定架构,您将获得一个配置了正确列名和类型以及一些约束的 DataTable。

于 2009-06-22T19:29:41.603 回答
2

有点远射,尝试使用 SET FMTONLY ON(或关闭)。根据 BOL,这“仅将元数据返回给客户端。可用于测试响应的格式,而无需实际运行查询。” 我怀疑这将包括您正在寻找的内容,因为 BCP 使用它。(我在调试一些非常奇怪的 BCP 问题时偶然发现了这个设置。)

于 2009-06-22T19:52:01.810 回答
1

你可以在你的过程中附加另一个选择吗?

如果是这样,您可以使用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 server 类型(即 varchar(25), int...)是我得到的

然后您可以打印出参数的类型、精度(即,如果 VarChar(25) 则为 25)和小数位数。

希望对您有所帮助... :)

于 2009-06-22T19:33:12.923 回答
0

如果您不限于 T-SQL,并且显然您不介意运行 SP(因为SET FMTONLY ON完全可靠),那么您绝对可以使用. 然后检查以获取列和数据类型。您可能还有多个结果集,您也可以从此环境轻松转到下一个结果集。SqlDataReaderSqlDataReader

于 2009-06-22T20:43:34.387 回答
0

这段代码应该可以解决您的问题。它返回没有记录的仅模式数据集。您可以使用此数据集来查询列的 DataType 和任何其他元数据。稍后,如果您愿意,可以通过创建 SqlDataAdapter 并调用它的 Fill 方法 (IDataAdapter.Fill) 来使用记录填充 DataSet。

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;
}
于 2015-04-28T22:23:27.307 回答
0

我知道这是一个老问题,我通过SqlDataAdapter.FillSchema 的链接找到了它,该链接带有包含临时表的存储过程。不幸的是,这两个问题都没有一个可以接受的答案,并且没有一个建议的答案能够解决我的问题。

为简洁起见,如果您使用的是SQL Server 2012或更高版本,则在大多数情况下使用以下内置函数将起作用:

但是,在某些情况下,这些函数不会提供任何有用的输出。就我而言,该问题与上面链接的问题更相似,因此,我相信在该问题下更合适地回答该解决方案。我的答案可以在这里找到。

于 2018-06-19T22:00:09.510 回答