在运行时从SQL Server查询结果显示列的数据类型和大小

时间:2009-06-22 19:21:40

标签: sql sql-server sql-server-2005 tsql sqlcmd

有没有办法运行查询,然后让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 个答案:

答案 0 :(得分:2)

对于根据参数返回不同结果集的存储过程,您会怎么做?

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

答案 1 :(得分:2)

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

答案 2 :(得分: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')

我是在this问题上发布的。

  

我在问如何告诉sql是什么   服务器类型(即varchar(25),int ...)   是我得到的

然后你可以打印出类型,精度(如果它的VarChar(25)就是25),以及参数的比例。

希望有帮助...... :)

答案 3 :(得分:0)

如果你不仅限于T-SQL,显然你不介意运行SP(因为SET FMTONLY ON不完全可靠),你肯定 CAN 调用SP来自C#,使用SqlDataReader。然后检查SqlDataReader以获取列和数据类型。您可能还有多个结果集,您也可以从此环境轻松转到下一个结果集。

答案 4 :(得分: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;
}

答案 5 :(得分:0)

我知道这是一个老问题,我通过SqlDataAdapter.FillSchema with stored procedure that has temporary table的链接找到了它。不幸的是,这两个问题都没有一个可接受的答案,而且提出的答案都不能解决我的问题。

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

但是,在某些情况下,这些功能将无法提供任何有用的输出。就我而言,该问题与以上链接的问题更为相似,因此,我认为该问题下的解决方案更为合适。我的答案可以在here中找到。