我有一个名为Tbl
的表,n
列数n
,rows
。
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
中插入的列
例如:
Select (Select ColNms
from TblColNms)
from Tbl
哪个应返回Tbl
的所有行,但只返回2个列名。
答案 0 :(得分:2)
这看起来像是以堆栈的形式存储数据。您可以使用PIVOT和动态查询来实现此目的。
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
原作者:http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/
答案 1 :(得分:0)
可能是这样的:
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
答案 2 :(得分:0)
您可以使用FOR XML PATH('')让SQL Server将一系列行值转换为逗号分隔列表,如下所示:
SELECT ',' + colName from ColumnNames for XML path('')
这会提供类似,first_column,another_column,last_column
如果在声明中执行此操作,则可以执行结果语句,就像使用sp_executesql在javascript中使用eval()一样
我在这里使用STUFF来删除第一个逗号
DECLARE @SQLQuery NVARCHAR(MAX) = 'SELECT '
+ STUFF((
SELECT ',' + colName from ColumnNames for XML path('')
), 1, 1, '') + ' FROM Product';
EXEC sp_executesql @SQLQuery
答案 3 :(得分:0)
据我所知,你需要一些存储在表中的特殊列名的行集结果:
CREATE PROCEDURE SP1 AS
BEGIN
SET NOCOUNT ON;
DECLARE @query as nvarchar(max) = 'SELECT '
SELECT @query = @query + ColNms + ','
FROM TblColNms
SET @query = LEFT(@query, LEN(@query) - 1 ) + ' FROM Tbl'
EXEC(@query)
END
GO
你将通过这样执行你的结果:
EXEC SP1
Temp1
的表格,然后像这样查询:CREATE PROCEDURE SP2 AS
BEGIN
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Temp1]') AND type in (N'U'))
DROP TABLE [dbo].[Temp1]
DECLARE @query as nvarchar(max) = 'SELECT '
SELECT @query = @query + ColNms + ','
FROM TblColNms
SET @query = LEFT(@query, LEN(@query) - 1 ) + ' INTO dbo.Temp1 FROM Tbl'
EXEC(@query)
END
当你想要你的结果时,请使用它:
EXEC SP2
SELECT * FROM Temp1
这种方式可以为您的结果提供更多选项,例如:
SELECT Top(<n>) *
FROM Temp1
WHERE <condition>