Sql server 在SQL中联接表行和表列

Sql server 在SQL中联接表行和表列,sql-server,sql-server-2008-r2,sql-server-2012,Sql Server,Sql Server 2008 R2,Sql Server 2012,我有一个名为Tbl的表,其中包含n列数和n行数 Create Table Tbl(Col1, Col2, Col3,...) 我有另一个名为TblColNms的表,我在其中维护列名 Create Table TblColNms(ColId, ColNms) 在TblColNms中,我插入了表“Tbl”的列名。例如: Insert into TblColNms(1, Col1) Insert into TblColNms(2, Col2) 我的要求是: 仅检索插入到TblColNms

我有一个名为
Tbl
的表,其中包含
n
列数和
n
行数

Create Table Tbl(Col1, Col2, Col3,...)
我有另一个名为
TblColNms
的表,我在其中维护列名

Create Table TblColNms(ColId, ColNms)
TblColNms
中,我插入了表“
Tbl
”的列名。例如:

Insert into TblColNms(1, Col1)
Insert into TblColNms(2, Col2)    
我的要求是:

仅检索插入到
TblColNms
中的列
例如:


它应该返回
Tbl
中的所有行,但只返回这两个列名。

这看起来像是以堆栈的形式存储数据。您可以使用PIVOT和动态查询来实现这一点

Create Table TblColNms(ColId, ColNms)
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(Course)
FROM (SELECT DISTINCT Course FROM #CourseSales) AS Courses

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT Year, ' + @ColumnName + '
    FROM #CourseSales
    PIVOT(SUM(Earning) 
          FOR Course IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

原作者:

可能是这样的:

DECLARE @TABLE_NAME NVARCHAR(MAX)
DECLARE @CMD NVARCHAR(MAX)
SET @TABLE_NAME = 'dbo.Table1'
SET @CMD = 'SELECT '

SELECT @CMD = @CMD + ',' + ColNms
FROM TblColNms

--eliminate leading comma
SET @CMD = REPLACE(@CMD,' ,',' ') + ' FROM ' + @TABLE_NAME

PRINT @CMD
EXEC sp_executesql @CMD
EXEC SP1
EXEC SP2

SELECT * FROM Temp1

通过使用FOR XML PATH(“”),可以让SQL Server将一系列行值转换为逗号分隔的列表,如下所示:

SELECT ',' + colName from ColumnNames for XML path('')
这将给出类似于
,第一列,另一列,最后一列的内容

如果在声明中执行此操作,则可以执行生成的语句,就像使用sp_executesql在javascript中使用eval()一样

我用这里的东西删除了第一个逗号

DECLARE @SQLQuery NVARCHAR(MAX) = 'SELECT ' 
           + STUFF((
                SELECT ',' + colName from ColumnNames for XML path('')
             ), 1, 1, '') + ' FROM Product';
EXEC sp_executesql @SQLQuery

据我所知,您需要由存储在表中的一些特殊列名设置行的结果:

  • 您需要一个可以静态给出结果的存储过程,如下所示:
  • 通过这样执行,您将得到您的结果:

    DECLARE @TABLE_NAME NVARCHAR(MAX)
    DECLARE @CMD NVARCHAR(MAX)
    SET @TABLE_NAME = 'dbo.Table1'
    SET @CMD = 'SELECT '
    
    SELECT @CMD = @CMD + ',' + ColNms
    FROM TblColNms
    
    --eliminate leading comma
    SET @CMD = REPLACE(@CMD,' ,',' ') + ' FROM ' + @TABLE_NAME
    
    PRINT @CMD
    EXEC sp_executesql @CMD
    
    EXEC SP1
    
    EXEC SP2
    
    SELECT * FROM Temp1
    
  • 创建一个类似于
    Temp1
    的表,并按如下方式对其进行查询:
  • 当你想要你的结果时,像这样使用它:

    DECLARE @TABLE_NAME NVARCHAR(MAX)
    DECLARE @CMD NVARCHAR(MAX)
    SET @TABLE_NAME = 'dbo.Table1'
    SET @CMD = 'SELECT '
    
    SELECT @CMD = @CMD + ',' + ColNms
    FROM TblColNms
    
    --eliminate leading comma
    SET @CMD = REPLACE(@CMD,' ,',' ') + ' FROM ' + @TABLE_NAME
    
    PRINT @CMD
    EXEC sp_executesql @CMD
    
    EXEC SP1
    
    EXEC SP2
    
    SELECT * FROM Temp1
    
    这种方式将为您提供更多选项,如为结果添加条件等,如:

    SELECT Top(<n>) * 
    FROM Temp1 
    WHERE <condition> 
    
    选择Top()*
    从Temp1开始
    哪里
    
    这将使用动态查询实现。您是否也要在
    TblColNms
    中存储表名?您如何处理多个表的列?@SelvaTS:请给我一个代码片段。除了动态查询还有其他选项吗?我不知道除了动态查询还有其他选项。但是我可以给你一些动态查询的代码片段。为什么你有一个表来保存表中列的名称???这听起来像是一个可怕的设计。更不用说sys.columns已经包含了每个表的所有列。有趣的答案。我喜欢这种可能性,但如果能把这个答案应用到这个问题上,我会很高兴的