2016-03-30 4 views
0

У меня есть задача, которая требует выбора столбцов из TableB, где PrimaryKey = PrimaryKey из TableA.Динамический выбор переменных из объединенной таблицы

Столбцы таблицы 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 

Это то, что я собирался использовать в Select 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' 

Я создаю эту таблицу с кучей переменных, где я буду использовать, чтобы увидеть значение динамической таблицы (@TreatmentTableVariables) для каждого экземпляра TreatmentID (первичный ключ) ,

Так результирующая таблица (Staging.tmpParameterCodes) будет выглядеть

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

А то у меня есть большой длинный набор запросов, чтобы сделать различные вещи с X количеством заданных переменных, а затем переменные из этого @goal table. В этом случае будут использоваться идентификаторы BookingWeekday и Channel, поскольку они имеют значения NULL arent. В разных местах мне нужно будет выбрать или сгруппировать по этим переменным. Если бы я собирался только выбрать эти переменные из таблицы, я хотел бы использовать:

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 

Но, как я уже сказал, прежде чем я хочу думать о более versitle решения вместо того, чтобы создавать различные копии указанного выше кода для использования с группа по или выбрать и т.д.

Просто ищите идеи о том, что я буду делать.

ответ

0

Простой, нединамическая подход будет заключаться в следующем:

SELECT * INTO #aTempTable,

, а затем ALTER #aTempTable уронить колонки вы не хотите.

Затем SELECT * FROM #aTempTable

Смежные вопросы