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已经包含了每个表的所有列。有趣的答案。我喜欢这种可能性,但如果能把这个答案应用到这个问题上,我会很高兴的