SQL 获取存储在不同 table 中的列的名称
SQL get the names of the columns that are stored in a different table
我有一篇文章 table,其中的通用列名称为 "PARAM1"、"PARAM2"、"PARAM3"...
这些列的真实名称存储在不同的table。
SELECT
A.PARAM1, -- This is the data
N1.NOMPAR, -- This is the column name
A.PARAM2 AS N2.NOMPAR -- This does not work, but the desired output
FROM dbo.ARTICULO AS A
LEFT JOIN dbo.NOMPARAMS AS N1 ON N1.NUMPAR = 1 AND N1.TIPPAR='ART'
LEFT JOIN dbo.NOMPARAMS AS N2 ON N2.NUMPAR = 2 AND N2.TIPPAR='ART';
我不想使用文章 table 中针对不同查询的硬编码别名,而是使用真实的实时数据。另外,有没有办法不对每个paramX做9次不同的left join?数据库一团糟,到处都在使用这种设计。谢谢
编辑:
这就是我现在的结果:
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
SET @DynamicTSQLStatement
= N'SELECT CODART, ' + STUFF(
(
SELECT ',[PARAM' + RIGHT([NUMPAR] + 10, 1) + '] AS [' + [NOMPAR] + ']'
FROM dbo.NOMPARAMS
WHERE TIPPAR = 'ART'
AND NOMPAR <> ''
ORDER BY [NUMPAR]
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'),
1,
1,
''
) + N'FROM dbo.ARTICULO';
EXEC sp_executesql @DynamicTSQLStatement;
仍在寻找如何向查询添加联接
SELECT C1.DESCCAR, -- This is the data
NP1.NOMPAR, -- This is the column name
C2.DESCCAR AS NP2.NOMPAR, -- This does not work, but the desired output
A.PARAM1, -- This is the data
N1.NOMPAR, -- This is the column name
A.PARAM2 AS N2.NOMPAR -- This does not work, but the desired output
FROM dbo.ARTICULO A
LEFT JOIN dbo.CARACTERISTICAS AS C1 ON(C1.TIPCAR='A' AND C1.NUMCAR='1' AND C1.CODCAR=A.CAR1)
LEFT JOIN dbo.CARACTERISTICAS AS C2 ON(C2.TIPCAR='A' AND C2.NUMCAR='2' AND C2.CODCAR=A.CAR2)
LEFT JOIN dbo.NOMPARAMS AS NP1 ON(NP1.TIPPAR='ART' AND NP1.NUMPAR='1')
LEFT JOIN dbo.NOMPARAMS AS N1 ON N1.NUMPAR=1 AND N1.TIPPAR='ART'
LEFT JOIN dbo.NOMPARAMS AS N2 ON N2.NUMPAR=2 AND N2.TIPPAR='ART';
以下code/logic可以用来完成你的任务:
DROP TABLE IF EXISTS #DataSource;
CREATE TABLE #DataSource
(
[Param01] INT
,[Param02] INT
,[Param03] INT
);
DECLARE @DataHeadings TABLE
(
[ColumnID] INT
,[ColumnName] SYSNAME
);
INSERT INTO #DataSource ([Param01], [Param02], [Param03])
VALUES (1, 1, 1)
,(2, 2, 2)
,(3, 3, 3);
INSERT INTO @DataHeadings ([ColumnID], [ColumnName])
VALUES (1, 'name')
,(2, 'age')
,(3, 'login');
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
SET @DynamicTSQLStatement = N'SELECT ' + STUFF
(
(
SELECT ',[Param' + RIGHT([ColumnID] + 100, 2) + '] AS [' + [ColumnName] + ']'
FROM @DataHeadings
ORDER BY [ColumnID]
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1
,1
,''
)
+ 'FROM #DataSource';
EXEC sp_executesql @DynamicTSQLStatement;
您可以使用一些动态的 SQL 来做到这一点,如下所示:
DECLARE @NOMPAR1 sysname, @NOMPAR2 sysname
SELECT
@NOMPAR1 = CASE WHEN NUMPAR = 1 THEN NOMPAR ELSE @NOMPAR1 END,
@NOMPAR2 = CASE WHEN NUMPAR = 2 THEN NOMPAR ELSE @NOMPAR2 END
FROM
NOMPARAMS
WHERE TIPPAR = 'ART'
DECLARE @sql nvarchar(4000)
SET @sql = N'
SELECT
A.PARAM1 AS ' + QUOTENAME(@NOMPAR1) + N',
A.PARAM2 AS ' + QUOTENAME(@NOMPAR2) + N'
FROM
ARTICULO A'
PRINT @sql
EXEC sp_executesql @sql
但它是如此丑陋,而且对开发人员不友好,我宁愿硬编码列别名。
更好的选择是依靠客户端应用程序来处理列名。
我有一篇文章 table,其中的通用列名称为 "PARAM1"、"PARAM2"、"PARAM3"...
这些列的真实名称存储在不同的table。
SELECT
A.PARAM1, -- This is the data
N1.NOMPAR, -- This is the column name
A.PARAM2 AS N2.NOMPAR -- This does not work, but the desired output
FROM dbo.ARTICULO AS A
LEFT JOIN dbo.NOMPARAMS AS N1 ON N1.NUMPAR = 1 AND N1.TIPPAR='ART'
LEFT JOIN dbo.NOMPARAMS AS N2 ON N2.NUMPAR = 2 AND N2.TIPPAR='ART';
我不想使用文章 table 中针对不同查询的硬编码别名,而是使用真实的实时数据。另外,有没有办法不对每个paramX做9次不同的left join?数据库一团糟,到处都在使用这种设计。谢谢
编辑:
这就是我现在的结果:
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
SET @DynamicTSQLStatement
= N'SELECT CODART, ' + STUFF(
(
SELECT ',[PARAM' + RIGHT([NUMPAR] + 10, 1) + '] AS [' + [NOMPAR] + ']'
FROM dbo.NOMPARAMS
WHERE TIPPAR = 'ART'
AND NOMPAR <> ''
ORDER BY [NUMPAR]
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)'),
1,
1,
''
) + N'FROM dbo.ARTICULO';
EXEC sp_executesql @DynamicTSQLStatement;
仍在寻找如何向查询添加联接
SELECT C1.DESCCAR, -- This is the data
NP1.NOMPAR, -- This is the column name
C2.DESCCAR AS NP2.NOMPAR, -- This does not work, but the desired output
A.PARAM1, -- This is the data
N1.NOMPAR, -- This is the column name
A.PARAM2 AS N2.NOMPAR -- This does not work, but the desired output
FROM dbo.ARTICULO A
LEFT JOIN dbo.CARACTERISTICAS AS C1 ON(C1.TIPCAR='A' AND C1.NUMCAR='1' AND C1.CODCAR=A.CAR1)
LEFT JOIN dbo.CARACTERISTICAS AS C2 ON(C2.TIPCAR='A' AND C2.NUMCAR='2' AND C2.CODCAR=A.CAR2)
LEFT JOIN dbo.NOMPARAMS AS NP1 ON(NP1.TIPPAR='ART' AND NP1.NUMPAR='1')
LEFT JOIN dbo.NOMPARAMS AS N1 ON N1.NUMPAR=1 AND N1.TIPPAR='ART'
LEFT JOIN dbo.NOMPARAMS AS N2 ON N2.NUMPAR=2 AND N2.TIPPAR='ART';
以下code/logic可以用来完成你的任务:
DROP TABLE IF EXISTS #DataSource;
CREATE TABLE #DataSource
(
[Param01] INT
,[Param02] INT
,[Param03] INT
);
DECLARE @DataHeadings TABLE
(
[ColumnID] INT
,[ColumnName] SYSNAME
);
INSERT INTO #DataSource ([Param01], [Param02], [Param03])
VALUES (1, 1, 1)
,(2, 2, 2)
,(3, 3, 3);
INSERT INTO @DataHeadings ([ColumnID], [ColumnName])
VALUES (1, 'name')
,(2, 'age')
,(3, 'login');
DECLARE @DynamicTSQLStatement NVARCHAR(MAX);
SET @DynamicTSQLStatement = N'SELECT ' + STUFF
(
(
SELECT ',[Param' + RIGHT([ColumnID] + 100, 2) + '] AS [' + [ColumnName] + ']'
FROM @DataHeadings
ORDER BY [ColumnID]
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1
,1
,''
)
+ 'FROM #DataSource';
EXEC sp_executesql @DynamicTSQLStatement;
您可以使用一些动态的 SQL 来做到这一点,如下所示:
DECLARE @NOMPAR1 sysname, @NOMPAR2 sysname
SELECT
@NOMPAR1 = CASE WHEN NUMPAR = 1 THEN NOMPAR ELSE @NOMPAR1 END,
@NOMPAR2 = CASE WHEN NUMPAR = 2 THEN NOMPAR ELSE @NOMPAR2 END
FROM
NOMPARAMS
WHERE TIPPAR = 'ART'
DECLARE @sql nvarchar(4000)
SET @sql = N'
SELECT
A.PARAM1 AS ' + QUOTENAME(@NOMPAR1) + N',
A.PARAM2 AS ' + QUOTENAME(@NOMPAR2) + N'
FROM
ARTICULO A'
PRINT @sql
EXEC sp_executesql @sql
但它是如此丑陋,而且对开发人员不友好,我宁愿硬编码列别名。
更好的选择是依靠客户端应用程序来处理列名。