从SQL查询结果创建表结构

从SQL查询结果创建表结构,sql,sql-server,database,Sql,Sql Server,Database,系统参数 MS SQL Server管理工作室 Windows Server 2012 R2标准 XML文件 问题 我在将查询结果放入它们自己的表和结构中时遇到了一个问题。我在“结果”窗口中得到我想要打印到屏幕上的表格,但是如何将这些结果放入自己的表格中呢?是否有一个函数可以将累积的结果发送到他们自己的表中?尝试使用我给出的玩具XML文件运行代码。您可以看到,创建的表与提供的图像中显示的结果不同。我想创建一个与执行的查询结果相同的表。下面有一张照片 我尝试过的事情 将所有临时数据tempAllD

系统参数

MS SQL Server管理工作室 Windows Server 2012 R2标准 XML文件

问题

我在将查询结果放入它们自己的表和结构中时遇到了一个问题。我在“结果”窗口中得到我想要打印到屏幕上的表格,但是如何将这些结果放入自己的表格中呢?是否有一个函数可以将累积的结果发送到他们自己的表中?尝试使用我给出的玩具XML文件运行代码。您可以看到,创建的表与提供的图像中显示的结果不同。我想创建一个与执行的查询结果相同的表。下面有一张照片

我尝试过的事情

将所有临时数据tempAllData放入其自己的表中 插入dbo.FastSpot_到kcompselect*FROM tempAllData 使用相同的脚本将所有其他临时表放入永久表中。 当前结果

谢谢

--代码--

首先,没有问题

这里的第二个查询问题


你已经用过类似的东西了吗?您可以返回SELECT的结果并将其存储到新表中。我不确定如何使用SELECT into。你能举一个例子来回答这个问题吗,@AlbertoSolano?Google for SELECT INTO SQL Server你在第一个脚本中使用它。。。选择p.*。。。。在MyPersonce的tempAllData中…那么,您得到了什么结果?您是否已经使用了类似的工具?您可以返回SELECT的结果并将其存储到新表中。我不确定如何使用SELECT into。你能举一个例子来回答这个问题吗,@AlbertoSolano?Google for SELECT INTO SQL Server你在第一个脚本中使用它。。。选择p.*。。。。在MyPersonce的临时数据中…那么,您得到了什么结果?
DECLARE @x AS XML=
(
SELECT CONVERT(XML, BulkColumn,2) AS BulkColumn
FROM OPENROWSET(BULK 'C:\path\to\xml\file.xml', SINGLE_BLOB) AS x
);
SELECT @x;

With MyPersonCTE AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS PersonID
          ,p.value('FirstName[1]','varchar(max)') AS FirstName
          ,p.value('LastName[1]','varchar(max)') AS LastName
          ,p.value('Biography[1]','varchar(max)') AS Biography
          ,p.value('Expertise[1]','varchar(max)') AS Expertise
          ,p.value('Image[1]','varchar(max)') AS Image
          ,p.value('Link[1]','varchar(max)') AS Link
          ,p.query('Books') AS BookNode
          ,p.query('Articles') AS ArticleNode
          --same for Papers, Artwork...
    FROM @x.nodes('/People/Person') AS A(p) 
)
,MyBooksCTE AS
(
    SELECT MyPersonCTE.*
          ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS BookID
          ,x.value('Year[1]','int') AS BookYear
          ,x.value('Details[1]','varchar(max)') AS BookDetails
    FROM MyPersonCTE
    CROSS APPLY MyPersonCTE.BookNode.nodes('/Books/Book') A(x)  
)
,MyArticlesCTE AS
(
    SELECT MyPersonCTE.*
          ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ArticleID
          ,x.value('Year[1]','int') AS ArticleYear
          ,x.value('Details[1]','varchar(max)') AS ArticleDetails
    FROM MyPersonCTE
    CROSS APPLY MyPersonCTE.ArticleNode.nodes('/Articles/Article') A(x)  
)
--same for Papers, Artwork...
SELECT p.*
      ,b.BookID
      ,b.BookYear
      ,b.BookDetails
      ,a.ArticleID
      ,a.ArticleYear
      ,a.ArticleDetails  
INTO #tempAllData
FROM MyPersonCTE AS p
LEFT JOIN MyBooksCTE AS b ON p.PersonID=b.PersonID
LEFT JOIN MyArticlesCTE AS a ON p.PersonID=a.PersonID ;

--#tempAllData is now filled with all data, copied in all combination: much to much
--but DISTINCT is your friend
--in this case you'd use the PersonID as FK in all related tables

SELECT DISTINCT PersonID,FirstName,LastName,Biography,Expertise --other fields
FROM #tempAllData;

SELECT DISTINCT PersonID,BookID,BookYear,BookDetails
FROM #tempAllData;

SELECT DISTINCT PersonID,ArticleID,ArticleYear,ArticleDetails
FROM #tempAllData;

DROP TABLE #tempAllData;
DROP TABLE #tempArticles
GO

DROP TABLE #tempBooks
GO

DROP TABLE #tempPerson
GO

DROP TABLE #tempAllData;
GO

--DROP TABLE FastSpot_To_KComp;
--GO

DECLARE @x AS XML=
(
SELECT CONVERT(XML, BulkColumn,2) AS BulkColumn
FROM OPENROWSET(BULK 'C:\KenyonCompass\Import\faculty-xml.xml', SINGLE_BLOB) AS x
);
SELECT @x;

With MyPersonCTE AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS PersonID
          ,p.value('FirstName[1]','varchar(max)') AS FirstName
          ,p.value('LastName[1]','varchar(max)') AS LastName
          ,p.value('Biography[1]','varchar(max)') AS Biography
          ,p.value('Expertise[1]','varchar(max)') AS Expertise
          ,p.value('Image[1]','varchar(max)') AS Image
          ,p.value('Link[1]','varchar(max)') AS Link
          ,p.query('Books') AS BookNode
          ,p.query('Articles') AS ArticleNode
          --same for Papers, Artwork...
    FROM @x.nodes('/People/Person') AS A(p) 
)
,MyBooksCTE AS
(
    SELECT MyPersonCTE.*
          ,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY (SELECT NULL)) AS BookID
          ,x.value('Year[1]','int') AS BookYear
          ,x.value('Details[1]','varchar(max)') AS BookDetails
    FROM MyPersonCTE
    CROSS APPLY MyPersonCTE.BookNode.nodes('/Books/Book') A(x)  
)
,MyArticlesCTE AS
(
    SELECT MyPersonCTE.*
          ,ROW_NUMBER() OVER(PARTITION BY PersonID ORDER BY (SELECT NULL)) AS ArticleID
          ,x.value('Year[1]','int') AS ArticleYear
          ,x.value('Details[1]','varchar(max)') AS ArticleDetails
    FROM MyPersonCTE
    CROSS APPLY MyPersonCTE.ArticleNode.nodes('/Articles/Article') A(x)  
)
--same for Papers, Artwork...
SELECT p.*
      ,b.BookID
      ,b.BookYear
      ,b.BookDetails
      ,a.ArticleID
      ,a.ArticleYear
      ,a.ArticleDetails  
INTO #tempAllData
FROM MyPersonCTE AS p
LEFT JOIN MyBooksCTE AS b ON p.PersonID=b.PersonID
LEFT JOIN MyArticlesCTE AS a ON p.PersonID=a.PersonID ;

--#tempAllData is now filled with all data, copied in all combination: much to much
--but DISTINCT is your friend
--in this case you'd use the PersonID as FK in all related tables

SELECT DISTINCT PersonID,FirstName,LastName,Biography,Expertise --other fields
INTO #tempPerson
FROM #tempAllData;

SELECT DISTINCT PersonID,BookID,BookYear,BookDetails
INTO #tempBooks
FROM #tempAllData;

SELECT DISTINCT PersonID,ArticleID,ArticleYear,ArticleDetails
INTO #tempArticles
FROM #tempAllData;

DECLARE @columnNames VARCHAR(MAX)=
 STUFF((SELECT DISTINCT ',Book_'+CAST(BookID AS VARCHAR(10)) FROM #tempBooks FOR XML PATH('')),1,1,'')
+(SELECT DISTINCT ',Article_'+CAST(ArticleID AS VARCHAR(10)) FROM #tempArticles FOR XML PATH(''));

DECLARE @cmd VARCHAR(MAX)=
'SELECT p.*
FROM
(
    SELECT p.*
          ,''Book_''+CAST(BookID AS VARCHAR(10)) AS ColumnName
          ,ISNULL(CAST(BookYear AS VARCHAR(4)),'''') + '' '' + BookDetails AS Data
    FROM #tempPerson AS p
    INNER JOIN #tempBooks AS b ON p.PersonID=b.PersonID
    UNION ALL
    SELECT p.*
          ,''Article_''+CAST(ArticleID AS VARCHAR(10)) AS ColumnName
          ,ISNULL(CAST(ArticleYear AS VARCHAR(4)),'''') + '' '' + ArticleDetails AS Data
    FROM #tempPerson AS p
    INNER JOIN #tempArticles AS a ON p.PersonID=a.PersonID
) AS tbl
PIVOT
(
    MAX(Data) FOR ColumnName IN(' +  @columnNames + ')
) AS p;'


EXEC(@cmd);
/*
DROP TABLE #tempArticles
GO

DROP TABLE #tempBooks
GO

DROP TABLE #tempPerson
GO

DROP TABLE #tempAllData;
GO
*/

--INSERT INTO dbo.FastSpot_To_KComp
--SELECT * FROM #tempAllData  
--ORDER  BY PersonID DESC;