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

Posted

技术标签:

【中文标题】在运行时显示 SQL Server 查询结果中的数据类型和列大小【英文标题】:Display DataType and Size of Column from SQL Server Query Results at Runtime 【发布时间】:2009-06-22 19:21:39 【问题描述】:

有没有办法运行查询,然后让 SQL Server management studio 或 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 

【问题讨论】:

您的意思是要列出存储过程中变量的数据类型?或者您想列出接收到的值的数据类型?一个例子会有所帮助 接收到的值的数据类型列表。我会看看我是否可以整理一个例子,但我可能无法立即做到。 【参考方案1】:

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

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

【讨论】:

当可能有不同的结果集时,我的计划是了解这一事实并提供必要的输入,以便将不同的结果集从 proc 中刷新,每次记录返回的类型。然后,我将设置我的客户端逻辑以相应地处理这些类型。在这一点上,我只想知道那里有什么。 我尝试了 FillSchema,但得到“无效的对象名称 '#tblTempProvider'”。所以看起来这要回到服务器来获取模式,不幸的是,这并不能帮助我处理这些过程中乱七八糟的临时表:(。我希望有一些方法可以根据实际传输,以避免此问题。 检查您遇到该错误的 SP。我敢打赌它引用了那个临时表。 请参阅下面关于 SET FMTONLY 的 Phillip Kelley 的回答。 它确实引用了一个临时表。我想这是我真正的问题。我真的只想要一种可靠的方法来获取类型而不查看实现。临时表与否。为什么 SQL Server 不能这样做?感谢您的信息。【参考方案2】:

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

【讨论】:

我试过这个,但似乎唯一的区别是没有返回任何记录。除了列名、计数和顺序之外,我找不到任何信息。 我只记得更多关于我奇怪的 BCP 问题的信息——与 BCP 失败有关,因为 SET FMTONLY ON 干扰了调用另一个过程的被调用过程,而父过程失败是因为“子”没有调用程序。如果您有嵌套的过程调用,这可能对您没有多大帮助。 (在我们从 SQL 2000 到 2005 的过渡期间是否这样做了,所以它可能适用于 2005 年。) Re: 仅列,是的,这听起来很可能——我不确定 BCP 是否想要或需要更多的东西,据我所知,BCP 和类似的“简单结果格式”例程是SET FMTONLY 存在的唯一原因。可能值得做一些认真的在线研究,看看在这样的通话期间是否有任何其他“隐形”信息返回......? 这对我有用 Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) Apr 22 2011 19:23:43 版权所有 (c) Microsoft Corporation Standard Edition (64-bit) o​​n Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor)【参考方案3】:

您能否将另一个 select 添加到您的过程中?

如果是这样,您也许可以使用 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 question 上发布了这个。

我在问怎么告诉sql 服务器类型(即 varchar(25)、int...) 是我得到的东西

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

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

【讨论】:

我很确定他想要关于每个存储过程的结果集的信息。【参考方案4】:

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

【讨论】:

【参考方案5】:

此代码应该可以解决您的问题。它返回没有记录的仅模式数据集。您可以使用此数据集来查询列的 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;

【讨论】:

【参考方案6】:

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

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

sys.dm_exec_describe_first_result_set sys.dm_exec_describe_first_result_set_for_object

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

【讨论】:

以上是关于在运行时显示 SQL Server 查询结果中的数据类型和列大小的主要内容,如果未能解决你的问题,请参考以下文章

sqlsever中对用户授权时显示无法授权

在SQLserver 2000中的表中取出一列,显示在一个gridview中,当表中该列数值为1时显示一张图片,

Oracle - 查询没有返回结果时显示“无行”

运行 nodemon server.js 时显示错误

SQL server安装时显示重启计算机失败问题解决办法

SQL SERVER 2008插入某些生僻字时显示是问号。