【问题标题】:How to insert dynamic sql result into temp table without knowing the columns in advance如何在不事先知道列的情况下将动态 sql 结果插入临时表
【发布时间】:2020-09-08 21:19:38
【问题描述】:

我正在尝试将动态 sql 的结果插入到临时表中。重要的是我事先不知道列名。根据SO suggestion,以下应该可以工作

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

INSERT into #T1 execute (@SQLString)
with same error `Invalid object name '#T1'.`

我应该可以 SELECT * FROM #T1

【问题讨论】:

  • 可能是我,但您是在哪里创建 #T1 表,还是在您的问题中意外省略了它?如果您查看您提供的“SO Suggestion”链接,表格确实会在那里创建

标签: tsql


【解决方案1】:

如果没有预定义表,您将无法执行 INSERT INTO。但我相信你要问的是做一个 SELECT INTO。我知道有两种方法。第一个使用 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')

您的第二个选项是创建一个内联 TVF,它将为您生成表结构。因此,您可以执行以下操作:

CREATE FUNCTION getDocuments()
RETURNS TABLE
AS
    RETURN
    SELECT * from Documents
GO

SELECT * into #T1 FROM getDocuments()

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 2020-02-18
    • 2014-02-22
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多