Tsql 如何在不预先知道列的情况下将动态sql结果插入临时表

Tsql 如何在不预先知道列的情况下将动态sql结果插入临时表,tsql,Tsql,我正在尝试将动态sql的结果插入临时表。重要的是我事先不知道列名。根据以下要求,应采取以下措施: INSERT into #T1 execute ('execute ' + @SQLString ) 此外,如果sql字符串不是过程,则省略EXECUTE 但是,这在SQL 2017上不起作用 CREATE TABLE Documents(DocumentID INT, Status NVARCHAR(10)) INSERT INTO Documents(DocumentID,Status) V

我正在尝试将动态sql的结果插入临时表。重要的是我事先不知道列名。根据以下要求,应采取以下措施:

INSERT into #T1 execute ('execute ' + @SQLString )
此外,如果sql字符串不是过程,则省略EXECUTE

但是,这在SQL 2017上不起作用

CREATE TABLE Documents(DocumentID INT, Status NVARCHAR(10))

INSERT INTO Documents(DocumentID,Status)
VALUES
(1,'Active'),
(2,'Active'),
(3,'Active'),
(4,'Active')


DECLARE @SQLString NVARCHAR(MAX)
SET @SQLString = 'SELECT * FROM Documents'


INSERT into #T1 execute ('execute ' + @SQLString )

I get error `Invalid object name '#T1'.`
然后我试着省略了execute

我应该能做到
选择*FROM T1

如果没有预定义表,则无法插入。但我相信你要求的是做一个选择。我知道有两种方法。第一种使用OPENROWSET,但我认为出于安全目的,这有一些缺点。您可以执行以下操作:

sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO

SELECT * 
INTO #T1
FROM OPENROWSET('SQLNCLI', 
                'Server=localhost;Trusted_Connection=yes;', 
                'SELECT * from <YOURDATABASE>.dbo.Documents')
CREATE FUNCTION getDocuments()
RETURNS TABLE
AS
    RETURN
    SELECT * from Documents
GO

SELECT * into #T1 FROM getDocuments()

可能是我,但您在哪里创建T1表,还是在您的问题中意外遗漏了它?如果查看您提供的SO建议链接,则会在那里创建该表
CREATE FUNCTION getDocuments()
RETURNS TABLE
AS
    RETURN
    SELECT * from Documents
GO

SELECT * into #T1 FROM getDocuments()