从连接表中动态选择变量

时间:2016-03-30 17:20:47

标签: sql-server

我有一项任务需要从TableB中选择来自TableA的PrimaryKey = PrimaryKey的列。

表B的列可以更改。

我需要选择TableB中的所有内容,除了'ColumnA'是PrimaryKey

DECLARE @COLUMNS VARCHAR(1000)
SELECT @Columns = SubString ((  SELECT + ', ' + 'Alias'+ QUOTENAME(Column_name)
from INFORMATION_SCHEMA.columns
WHERE Table_name ='TableB'
AND COLUMN_NAME !='ColumnB'
FOR XML PATH ( '' ) ), 3, 1000) 
print @COLUMNS

这就是我要在选择列阶段使用的内容,但我想弄清楚是否有更好的方法,因为表别名会在整个程序中发生变化所以我不想每次都要调整它。

可能是我没有以正确的方式解决这个问题。

一些背景知识:

DECLARE @TreatmentTableVariables TABLE(ParameterCode VARCHAR(64), Value varchar(64))

INSERT @TreatmentTableVariables  VALUES ('SourceCode','NS')
INSERT @TreatmentTableVariables  VALUES ('TripFirstTravelDate','')
INSERT @TreatmentTableVariables  VALUES ('PaxType','')
INSERT @TreatmentTableVariables  VALUES ('ChannelID','')
INSERT @TreatmentTableVariables  VALUES ('RoleName','')
INSERT @TreatmentTableVariables  VALUES ('TripOriginLocationCode',NULL)
INSERT @TreatmentTableVariables  VALUES ('TripDestinationLocationCode',NULL)
INSERT @TreatmentTableVariables  VALUES ('ExternalBookingID',NULL)
INSERT @TreatmentTableVariables  VALUES ('NumberOfPassengers',NULL)
INSERT @TreatmentTableVariables  VALUES ('FareClass',NULL)
INSERT @TreatmentTableVariables  VALUES ('TripType',NULL)
INSERT @TreatmentTableVariables  VALUES ('BookingWeekday','Monday')
INSERT @TreatmentTableVariables  VALUES ('TripOriginCountryCode','')

SELECT  DISTINCT ParameterCode, Value
INTO  Staging.tmpParameterCodes
FROM @TreatmentTableVariables;

SET @ParameterCodesToPivot = (SELECT '['+LEFT(ParameterCode, LEN(ParameterCode) - 2)
                              FROM (
                                        SELECT ParameterCode + '],['
                                        FROM Staging.tmpParameterCodes
                                        where Value IS NOT NULL 
                                        FOR XML PATH ('')

                                    ) c (ParameterCode)
                              )     

SET @sqlquery = '
    SELECT *
    INTO 
   Staging.tmpTreatmentInputParameters
    FROM
        (
            SELECT 
                tip.TreatmentID,
                tip.ParameterCode,
                tip.ClientCode,
                tip.Value
            FROM AnalyticsDW.TreatmentInputParameter tip
            inner join Staging.tmpParameterCodes TPC
            on tip.ParameterCode=TPC.ParameterCode
            --join Staging.tmpFlattenTreatmentData1 t on tip.TreatmentID=t.TreatmentID
            Where 
            --tip.TreatmentID between @MinTreatmentID and @MaxTreatmentID
            --and
             TPC.Value IS NOT NULL
             and (TPC.Value=tip.Value or TPC.Value='''')
        )p
        PIVOT
        (
            MIN(Value)
            FOR ParameterCode IN ( '+ @ParameterCodesToPivot +' )
        ) 

        AS PVT'

我正在使用一堆变量创建此表,我将使用它来查看每个TreatmentID实例(主键)的动态表(@TreatmentTableVariables)的值。

结果表(Staging.tmpParameterCodes)看起来像

DECLARE @goal TABLE(
ParameterCode varchar(100),
Value VARCHAR(100)
)
insert into @goal values
('BookingWeekday','Monday'),
('ChannelID',''),
('ExternalBookingID',NULL)

然后我有一大堆查询用X个设置变量做不同的事情,然后是这个@goal表中的变量。在这种情况下,将使用BookingWeekday和Channel ID,因为它们不是NULL值。在不同的地方,我需要选择或分组这些变量。如果我只是从表中选择这些变量,我会使用:

DECLARE @COLUMNS VARCHAR(1000)
SELECT @Columns = SubString ((  SELECT + ', ' + 'Alias'+ QUOTENAME(Column_name)
from INFORMATION_SCHEMA.columns
WHERE Table_name ='goal'
AND COLUMN_NAME !='ColumnB'
FOR XML PATH ( '' ) ), 3, 1000) 
print @COLUMNS

但正如我之前所说,我想要考虑更多的解决方案,而不是创建上述代码的不同副本以用于分组或选择等。

只是在寻找关于我会做什么的想法。

1 个答案:

答案 0 :(得分:0)

一种简单的非动态方法是:

SELECT * INTO #aTempTable

然后ALTER #aTempTable删除您不想要的列。

然后SELECT * FROM #aTempTable