代码之家  ›  专栏  ›  技术社区  ›  Blake Taylor

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

  •  9
  • Blake Taylor  · 技术社区  · 17 年前

    有没有一种方法可以运行一个查询,然后让sqlservermanagementstudio或sqlcmd之类的东西在接收到列时简单地显示每列的数据类型和大小。

    一点背景: 我之所以问这个问题,是因为我必须与无数的遗留存储过程进行交互,每个存储过程都有50到5000多行代码。我不想尝试遵循进出临时表、进入其他过程、进入字符串连接的eval语句等等的神秘逻辑流。我不想对实现保持了解,只想知道它们工作时会发生什么。不幸的是,遵循逻辑流似乎是唯一一种不需要尝试推断数据字符串表示形式的实际类型的方法,例如,从managementstudio studio或.net中的本机类型推断返回的是什么。

    澄清: 我不是在问如何区分表的类型或类似的静态类型。我很肯定像sp_help这样的东西对我没有帮助。我在问如何判断sql server类型(即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 
    
    6 回复  |  直到 17 年前
        1
  •  2
  •   John Saunders    17 年前

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

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

        2
  •  2
  •   Philip Kelley    17 年前

        3
  •  1
  •   Community Mohan Dere    9 年前

    你能再加一个吗 选择

    如果是这样,您可以使用 sql_variant_属性 功能。

    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,以及参数的小数位数。

    希望这能帮助。。。 :)

        4
  •  0
  •   Cade Roux    17 年前

    如果您不局限于T-SQL,而且显然您不介意运行SPs(因为 SET FMTONLY ON 不完全可靠),你肯定 可以 使用 SqlDataReader . 然后检查 数据阅读器 获取列和数据类型。您可能还有多个结果集,您也可以从这个环境轻松转到下一个结果集。

        5
  •  0
  •   John C    11 年前

    这个密码应该能帮你搞定。它返回一个只包含架构的数据集,没有记录。可以使用此数据集查询列的数据类型和任何其他元数据。以后,如果愿意,可以通过创建SqlDataAdapter并调用它的Fill方法来填充数据集(IDataAdapter。填充).

    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
  •  0
  •   Bobby    8 年前

    SqlDataAdapter.FillSchema with stored procedure that has temporary table . 不幸的是,这两个问题都没有一个可接受的答案,而且没有一个建议的答案能够解决我的问题。

    为了简洁起见,如果您使用 或者以后,使用以下内置函数在大多数情况下都可以工作:

    但是,在某些情况下,这些函数不会提供任何有用的输出。在我的例子中,这个问题更类似于上面提到的问题,因此,我认为在这个问题下,解决办法更合适。我的答案可以找到 here .