首页 > 解决方案 > 如何在不创建表的情况下将动态查询的结果存储在临时表中?

问题描述

我们正在编写一个存储过程,负责获取存储过程名称并返回包含存储过程列及其数据类型的结果。但是,我们在执行动态查询以返回存储过程的结果时遇到了问题,但我们不能将它存储在临时表中!

您可以在下面看到我们的查询:

  DECLARE @ProcName VARCHAR(100)='spGetOraganizationsList',
  @ParamName VARCHAR(100),@DataType VARCHAR(20),
  @Query NVARCHAR(MAX)='EXEC '+'spGetOraganizationsList '

  SELECT  PARAMETER_NAME,DATA_TYPE 
  INTO #Tmp
  FROM  information_schema.PARAMETERS
  WHERE SPECIFIC_NAME=@ProcName

  DECLARE ParamCursor CURSOR 
  FOR SELECT * FROM #Tmp
  OPEN ParamCursor
  FETCH NEXT FROM ParamCursor
  INTO @ParamName,@DataType

  WHILE @@FETCH_STATUS = 0 
  BEGIN
  SET @Query=@Query+@ParamName+'=Null,'
  FETCH NEXT FROM ParamCursor INTO @ParamName,@DataType
  END
  CLOSE ParamCursor
  DEALLOCATE ParamCursor
  DROP TABLE #Tmp
  
  EXEC sp_executesql @Query

问题是我不能将它的结果存储在临时表中,并且OPENROWSET不接受变量。

标签: sqlsql-server

解决方案


我认为它来自 sql 概念,它不信任存储过程的结果,因此我们无法通过“在查询表中创建”方法对其进行选择或将其存储在表中。除非您创建一个表并定义它的列和对您的 sql 信任,并且您将它的结果插入到该表中,例如采取以下情况

Create table test (name varchar(10),family varchar(20))


Insert into test
Exec sp-testResult

现在,如果您为表定义错误的列,您将收到查询运行时错误。实际上 sql 不会预测 sp 的结果,而是让您定义存储过程的结果。


推荐阅读