如何在不创建表的情况下将动态查询的结果存储在临时表中?

Abo*_*azl 8 sql sql-server

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

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

  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
Run Code Online (Sandbox Code Playgroud)

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

Abo*_*azl 3

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

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


Insert into test
Exec sp-testResult
Run Code Online (Sandbox Code Playgroud)

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