【问题标题】:How to create temp table with dynamic SQL query result如何使用动态 SQL 查询结果创建临时表
【发布时间】:2017-11-16 11:59:07
【问题描述】:

我有这个存储过程:

Declare @MarketID AS NVARCHAR(MAX) = '1.136529848';
Declare @UserID AS NVARCHAR(MAX) = '6a309d84-d1c6-434d-b9df-4f96a74da912';

DECLARE @colsSelect AS NVARCHAR(MAX);
DECLARE @colsTemp AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

SELECT
    @colsSelect = STUFF((SELECT distinct ',' +
                    '''''' + ' as ' + QUOTENAME(name) 
                         FROM RunnersInfoes  AS t 
                         WHERE marketID = @MarketID 
                         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') , 1, 1, '');

PRINT @colsSelect

SET @query= ';WITH cte AS
             (
                  SELECT
                      id, ParentId, 0 AS Level, Share, AccountTypeName, FirstName
                  FROM
                      dbo.View_UserProfile 
                  WHERE
                      View_UserProfile.id = ' + '''' + @UserID + '''' +'
                  UNION ALL
                  SELECT
                      t.id, t.ParentId, Level + 1 AS Level, t.Share, t.AccountTypeName, t.FirstName
                  FROM
                      View_UserProfile t  
                  INNER JOIN
                      cte ON t.ParentId = cte.id
             )
             SELECT 
                 ID, AccountTypeName AS Type, FirstName AS Name, ' + @colsSelect + '      
             FROM cte AS t'

EXECUTE (@query)

它正在生成这个结果:

我想为以下结果创建临时表或变量类型表,请记住此结果的列是动态呈现的。有时结果返回更多列,有时返回更少,但每个结果的前 3 列保持不变。因此,请帮助在存储过程中创建动态表。

【问题讨论】:

  • 你可以做一个select ... into ... from..
  • 在哪里?我的意思是在这段代码中我应该在哪里输入 select ... into ... from.. 语句?
  • @GuidoG 但我的结果带有动态列,每个参数都不相同

标签: sql sql-server stored-procedures


【解决方案1】:

你可以这样做:

SELECT ID
,      AccountTypeName AS Type
,      FirstName AS Name
,      ' + @colsSelect + ' 
INTO   ##TEMPTABLE     
FROM   cte AS t

由于您动态执行此操作,因此您不能使用#TEMPTABLE,因为本地临时表只会存在于定义它的查询范围内。使用## 创建一个全局临时表,可以在动态查询范围之外访问。

【讨论】:

    【解决方案2】:

    请为您的用例使用SELECT - INTO 子句,如下所示

    SELECT * INTO #temptable FROM cte
    

    【讨论】:

      【解决方案3】:

      要创建一个由动态查询填充的临时表,请使用此示例中的全局临时表。
      要使 select ... into ... 语句起作用,您需要确保 select 中的每一列都有一个名称。

      declare @query varchar(1000) = 'select 1 as ID, ''test'' as Column_1 into ##mytable'
      
      exec (@Query)
      
      select * from ##mytable
      
      drop table ##mytable
      

      完成后不要忘记删除临时表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多