有必须是连接更简单的方法来做到这一点...低看哪,有...!
“ sp_describe_first_result_set ”是您的朋友!
现在,我的确意识到这个问题是专门针对SQL Server 2000提出的,但是我正在寻找针对更高版本的类似解决方案,并且发现了SQL的一些本机支持来实现此目的。
在SQL Server 2012及更高版本中,请参见。“ sp_describe_first_result_set”-链接到BOL
我已经使用类似于@Trisped的技术实现了解决方案,并将其剥离以实现本机SQL Server实现。
如果您还不在SQL Server 2012或Azure SQL数据库上,请使用以下为2012年之前的时代数据库创建的存储过程:
CREATE PROCEDURE [fn].[GetQueryResultMetadata]
@queryText VARCHAR(MAX)
AS
BEGIN
PRINT @queryText;
DECLARE
@sqlToExec NVARCHAR(MAX) =
'SELECT TOP 1 * INTO #QueryMetadata FROM ('
+
@queryText
+
') T;'
+ '
SELECT
C.Name [ColumnName],
TP.Name [ColumnType],
C.max_length [MaxLength],
C.[precision] [Precision],
C.[scale] [Scale],
C.[is_nullable] IsNullable
FROM
tempdb.sys.columns C
INNER JOIN
tempdb.sys.types TP
ON
TP.system_type_id = C.system_type_id
AND
-- exclude custom types
TP.system_type_id = TP.user_type_id
WHERE
[object_id] = OBJECT_ID(N''tempdb..#QueryMetadata'');
'
EXEC sp_executesql @sqlToExec
END
SELECT * FROM INFORMATION_SCHEMA.Columns