Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从另一个表动态化列别名_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何从另一个表动态化列别名

Sql 如何从另一个表动态化列别名,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下面的查询,我正在寻找从另一个表中动态显示列名标签的方法。 在表#Tmp2中,Dim1根据Dim1.Num变化,例如我可以 对于Dim1.Num=1=>Dim1=BusinessUnit 在其他cas中,我可以拥有Dim1.Num=1=>Dim1=Department SELECT Dim1.Dim1 ,Dim1.ValueDim1 , Dim2.Dim2 ,Dim2.ValueDim2 , #Tmp1.Amount INTO #Tmp3 FROM

我有下面的查询,我正在寻找从另一个表中动态显示列名标签的方法。 在表#Tmp2中,Dim1根据Dim1.Num变化,例如我可以 对于
Dim1.Num=1=>Dim1=BusinessUnit

在其他cas中,我可以拥有
Dim1.Num=1=>Dim1=Department

SELECT Dim1.Dim1 ,Dim1.ValueDim1  ,
       Dim2.Dim2 ,Dim2.ValueDim2  ,
       #Tmp1.Amount

INTO   #Tmp3

FROM   #Tmp1

INNER JOIN #Tmp2 as Dim1 on Dim1.id = #Tmp1.id And Dim1.Num=1
INNER JOIN #Tmp2 as Dim2 on Dim1.id = #Tmp1.id And Dim2.Num=2
结果是:

Dim1            ValueDim1  Dim2         ValueDim2  Amount
BusinessUnit    002        Department   027        1000
但是我想要这个结果

BusinessUnit    ValueDim1  Department   ValueDim2  Amount
BusinessUnit    002        Department   027        1000
也就是说,根据
#Tmp2.Num的值,列的适用名称可以更改

我可能是这样的

SELECT Dim1.Dim1 AS (select Dim from #Tmp2 where #Tmp2.Num = 1)

您可以使用动态SQL:

DECLARE @ColName VARCHAR(20) = (select Dim from #Tmp2 where #Tmp2.Num = 1)

EXEC('SELECT Dim1.Dim1 ['+@ColName+'] ,Dim1.ValueDim1  ,
       Dim2.Dim2 ,Dim2.ValueDim2  ,
       #Tmp1.Amount

INTO   #Tmp3

FROM   #Tmp1

INNER JOIN #Tmp2 as Dim1 on Dim1.id = #Tmp1.id And Dim1.Num=1
INNER JOIN #Tmp2 as Dim2 on Dim1.id = #Tmp1.id And Dim2.Num=2')
这样做的局限性(以及您的一般问题)是,如果您的
#Tmp2
有两条记录具有相同的
Num
,那么查询将抛出一个
子查询,返回多个值。解决此问题的唯一方法是更改@ColName查询,使其仅返回单个值:

DECLARE @ColName VARCHAR(20) = (select TOP 1 Dim from #Tmp2 where #Tmp2.Num = 1)
更新:

如果获取列名的查询可能返回0条记录,请按如下方式修改查询:

DECLARE @ColName VARCHAR(20) = (
    select Dim from #Tmp2 where #Tmp2.Num = 1 
    UNION 
    SELECT 'DefaultValue' WHERE NOT EXISTS (select Dim from #Tmp2 where #Tmp2.Num = 1)
    )
但是,如果查询返回一条记录,但要用作列名的列中的值为null,则按如下方式修改查询:

DECLARE @ColName VARCHAR(20) = (select ISNULL(Dim,'DefaultValue') from #Tmp2 where #Tmp2.Num = 1)

看起来我有一个问题,有时我有@ColName null,所以我必须做一些类似的事情:Dim7.Dim7.FinalValue,当Dim7.FinalValue=''然后Dim7 ELSE['+@Dim7+']结束