执行存储过程后如何判断数据类型?

Posted

技术标签:

【中文标题】执行存储过程后如何判断数据类型?【英文标题】:How to tell the data types after executing a stored procedure? 【发布时间】:2010-09-07 04:26:40 【问题描述】:

在 Management Studio 中执行存储过程时,是否有办法返回结果集的数据类型?我正在寻找类似将表名传递给 sp_help 的功能

【问题讨论】:

【参考方案1】:

如果您通过 ADO、ADO.NET、ODBC 或类似方式调用存储过程,您确实可以查看类型:生成的记录集具有您正在寻找的类型信息。您真的仅限于 Management Studio 吗?

【讨论】:

【参考方案2】:

最好的办法是将存储过程更改为函数。但这只有在您的环境允许时才有效。

【讨论】:

【参考方案3】:

如果不解析 syscmets 来查看它从哪里查询的内容,就不会想到任何简单的方法。如果您可以编辑 SP 以选择 XML,则可以将 XML_INFO 附加到查询以获取模式。

【讨论】:

【参考方案4】:

实际上,您可以在 SP 中执行此操作:

EXEC ('if exists (select * from sys.tables where name = ''tmp_TableName'') drop table tmp_TableName')

EXEC ('select * into tmp_TableName from MyTable')

-- Grab the column types from INFORMATION_SCHEMA here

EXEC ('if exists (select * from sys.tables where name = ''tmp_TableName'') drop table tmp_TableName')

虽然,我认为一定有更好的办法。

【讨论】:

【参考方案5】:

这不是最优雅的解决方案,但您可以使用 OPENROWSET 将存储的 proc 结果放入表中,然后使用 sp_help 获取它的描述。

例如

select * into tmp_Results 
from openrowset( 'SQLOLEDB.1'
               , 'Server=your_server_name;Trusted_Connection=yes;'
               , 'exec your_stored_proc')
exec sp_help 'tmp_Results'
drop table tmp_Results

【讨论】:

【参考方案6】:

您始终可以使用具有唯一性的实际表格。这是一个kludge,但它是一个选项。不过,这在存储过程中不起作用。

if exists (select * from sys.tables where name = 'tmp_TableName')
    drop table tmp_TableName
go
select * into tmp_TableName from MyTable

--do some stuff

go
if exists (select * from sys.tables where name = 'tmp_TableName')
    drop table tmp_TableName
go

【讨论】:

以上是关于执行存储过程后如何判断数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据类型及存储过程

oracle 检查字符中数据类型 函数&存储过程

如何从具有执行类型作为嵌入式查询的 Control-M 数据库作业运行 SQL Developer 中存在的存储过程

如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程

如何使用 Powershell 处理 sql_Variant sql 数据类型

oracle 如何返回多条记录