从 sql 服务器中的动态 sql 查询(使用执行语句)获取字段数

Get number of fields from dynamic sql query (with execute statement) in sql server

我在 sql-server 中有以下查询:我想查找查询输出中的字段数。

SET @query1 = 'SELECT Strain_ID, COLNAMES as Markers, ' + @cols + '

FROM 
 (  -- Source data for pivoting
    SELECT CONCAT(Chromosome,''_'',Locus) ChrLocus,Strain_ID,Markers, COLNAMES, sort
    FROM ProgenyRawJuly14   
    CROSS APPLY(VALUES (1, MarkerSet1,''MarkerSet1''),(2, MarkerSet2,''MarkerSet2''),(3, Parent1_Marker,''Parent1_Marker''),(4, Parent2_MarkerA,''Parent2_MarkerA''),
    (5, Parent2_MarkerB,''Parent2_MarkerB''))
    AS COLUMNNAMES(Sort, Markers,COLNAMES)
    UNION 
    SELECT CONCAT(Chromosome,''_'',Locus) ChrLocus,Strain_ID,Markers, COLNAMES, sort 
    FROM ParentRawTableJuly14 
    CROSS APPLY(VALUES (1, MarkerSet1,''MarkerSet1''),(2, MarkerSet2,''MarkerSet2''),(3, Parent1_Marker,''Parent1_Marker''),(4, Parent2_MarkerA,''Parent2_MarkerA''),
    (5, Parent2_MarkerB,''Parent2_MarkerB''))
    AS COLUMNNAMES(Sort, Markers,COLNAMES)

  ) x

 PIVOT 
 (
     --Defines the values in each dynamic columns
     min(Markers)
     -- Get the names from the @cols variable to show as column
     FOR ChrLocus IN ('+ @cols +')
 ) p 

order by Strain_ID, sort;'

EXEC SP_EXECUTESQL @query= @query1, @params= N'@queryO NVARCHAR(MAX) OUTPUT',              
@queryO= @queryO OUTPUT; 

select @queryO;

如何获取@queryO 中的字段数,以便我可以创建具有该列数的临时 table?

这似乎是一种迂回的方式...但它有效:

SET @query1 = 'SELECT Strain_ID, COLNAMES as Markers, ' + @cols + '
into #temp;
FROM 
 (  -- Source data for pivoting
    SELECT CONCAT(Chromosome,''_'',Locus) ChrLocus,Strain_ID,Markers, COLNAMES, sort
    FROM ProgenyRawJuly14   
    CROSS APPLY(VALUES (1, MarkerSet1,''MarkerSet1''),(2, MarkerSet2,''MarkerSet2''),(3, Parent1_Marker,''Parent1_Marker''),(4, Parent2_MarkerA,''Parent2_MarkerA''),
    (5, Parent2_MarkerB,''Parent2_MarkerB''))
    AS COLUMNNAMES(Sort, Markers,COLNAMES)
    UNION 
    SELECT CONCAT(Chromosome,''_'',Locus) ChrLocus,Strain_ID,Markers, COLNAMES, sort 
    FROM ParentRawTableJuly14 
    CROSS APPLY(VALUES (1, MarkerSet1,''MarkerSet1''),(2, MarkerSet2,''MarkerSet2''),(3, Parent1_Marker,''Parent1_Marker''),(4, Parent2_MarkerA,''Parent2_MarkerA''),
    (5, Parent2_MarkerB,''Parent2_MarkerB''))
    AS COLUMNNAMES(Sort, Markers,COLNAMES)

  ) x

 PIVOT 
 (
     --Defines the values in each dynamic columns
     min(Markers)
     -- Get the names from the @cols variable to show as column
     FOR ChrLocus IN ('+ @cols +')
 ) p 

order by Strain_ID, sort;
SELECT @queryO=COUNT(*) FROM tempdb.sys.columns WHERE object_id = object_id(''tempdb..#temp'');
select * from #temp;'

EXEC SP_EXECUTESQL @query= @query1, @params= N'@queryO NVARCHAR(MAX) OUTPUT',              
@queryO= @queryO OUTPUT; 

select @queryO;

如果在为@cols 变量生成列表时只获取列数,似乎效率会更高。

如果您只是直接创建 table,您可能还想研究使用 OPENROWSET:Insert results of a stored procedure into a temporary table