执行存储过程后如何判断数据类型?
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
【讨论】:
以上是关于执行存储过程后如何判断数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何从具有执行类型作为嵌入式查询的 Control-M 数据库作业运行 SQL Developer 中存在的存储过程
如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程