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

在运行时显示SQL Server查询结果中列的数据类型和大小,sql,sql-server,sql-server-2005,tsql,sqlcmd,Sql,Sql Server,Sql Server 2005,Tsql,Sqlcmd,是否有一种方法可以运行查询,然后让SQLServerManagementStudio或sqlcmd或其他东西简单地显示接收到的每个列的数据类型和大小 在服务器和客户机之间传输数据时,似乎必须提供此信息。如果能展出的话,对我会很有帮助的 一点背景: 我问这个问题的原因是因为我必须与无数的遗留存储过程进行接口,每个存储过程都有50到5000多行代码。我不想尝试跟随隐藏的逻辑流进出临时表,进入其他过程,进入字符串连接的eval语句等等。我不想对实现保持任何了解,只想知道它们工作时会发生什么。不幸的是,

是否有一种方法可以运行查询,然后让SQLServerManagementStudio或sqlcmd或其他东西简单地显示接收到的每个列的数据类型和大小

在服务器和客户机之间传输数据时,似乎必须提供此信息。如果能展出的话,对我会很有帮助的

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

澄清:我不是在问如何区分表的类型或类似静态的东西。我很确定像sp_help这样的东西对我没有帮助。我想问的是,如何判断sql server类型(即varchar(25),int…)是我所得到的类型。另外,更改SCOPRS的实现是不可能的,所以请在您的解决方案中考虑。我真的希望有一个命令我错过了某处。非常感谢大家

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

CREATE PROCEDURE [dbo].[IReturnATempTable]
AS

Create table #TempTable 
( 
    MyMysteryColumn char(50)
)

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


select TOP 50 * FROM #TempTable 

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

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

您可以在过程中附加另一个select吗

如果是这样的话,您可能可以通过使用sql\u variant\u属性函数来实现

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…) 都是我所得到的

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


希望这有助于:)

有点远,试着在设置FMTONLY ON(或off)的情况下胡闹一下。根据BOL的说法,这“只向客户端返回元数据。可以用来测试响应的格式,而无需实际运行查询。”我怀疑这将包含您要查找的内容,因为BCP使用这一功能。(我在调试一些非常奇怪的BCP问题时偶然发现了这个设置。)

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

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


我知道这是一个老问题,我是通过一个链接找到的。不幸的是,这两个问题都没有一个被接受的答案,而且提议的答案都不能解决我的问题

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


但是,在某些情况下,这些函数不会提供任何有用的输出。就我而言,这个问题与上面的问题更为相似,因此,我认为这个问题下的答案更为恰当。可以找到我的答案。

您的意思是要列出存储过程中变量的数据类型?还是要列出所接收值的数据类型?例如,所接收值的数据类型帮助列表。我会看看是否可以组合一个示例,但我可能无法立即这样做。我很确定他想从每个存储过程中获取有关resultset的信息。当可能存在不同的结果集时,我的计划是了解这一事实,并提供必要的输入,以便将不同的结果集从进程中清除,每次记录返回的类型。然后,我将设置客户端逻辑来相应地处理这些类型。此时,我只想知道存在什么。我尝试了FillSchema,得到了“无效的对象名”#tblTempProvider“。所以看起来这是返回到服务器以获取模式,不幸的是,这对我处理在这些过程中杂乱无章的临时表没有帮助:(.我希望有某种方法可以根据实际传输情况选择类型,以避免出现此问题。请检查出现此错误的SP。我打赌它引用了该临时表。请参阅下面Phillip Kelley关于SET FMTONLY的回答。它确实引用了临时表。我想这是我真正的问题。我真的只想要一个relia无需查看imple即可获取类型的简单方法
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;
}