Agarwal1984 Ответов: 2

Выберите имя столбца динамически на основе строк из другой таблицы в SQL server


Привет,

Я хочу отобразить свое динамическое значение столбца в запросе select.
мое имя столбца хранится в другой таблице.

select ColumnName from LCompanySpecificColumns CSC where CSC.Label='Duration' and CSC.CompanyCode = 'DE' and CSC.TableName = 'LProducts' and CSC.SelecterType = 'Kias-Soc'


этот результат запроса с объединить
AttributeC02

AttributeC02

AttributeC02

AttributeC02


<pre>AttributeC02
это имя моего столбца в таблице LProducts.
Я хочу добиться результата:-
AttributeC02 // Имя Столбца
С12
C223

Пожалуйста, помогите мне.

заранее спасибо.
Анкит Агарвал
инженер-программист

Что я уже пробовал:

select LP.ProductCode as ProductId,LP.Name as PRODUCT_DESCRIPTION,PC.Name as PRODUCT_ID_CATEGORY,PS.Name as SOURCE_SYSTEM,(select ColumnName from LCompanySpecificColumns CSC where CSC.Label='Duration' and CSC.CompanyCode = 'DE' and CSC.TableName = 'LProducts' and CSC.SelecterType = 'Kias-Soc') as ESTIMATED_CONTRACT_DURATION_ID from LProducts as LP 
inner join RSysCat as SC on LP.SysCatId=SC.Id
inner join RProductCategories PC on SC.CategoryId=PC.Id
inner join RProductSystems PS on SC.SystemId=PS.Id

2 Ответов

Рейтинг:
2

Santosh kumar Pithani

SELECT ID,Col_Names INTO #Temp1 FROM 
                                     (VALUES(12,'EmpId'),
									        (21,'EmpName'),
											(23,'Location'))AS Temp1(ID,Col_Names);

SELECT EmpId,EmpName,Location  into #Temp2 FROM 
                                               (VALUES(1246,'Santosh kumar','HYD'),
											          (1215,'Harish Kumar','Channai'),
													  (1234,'Sai kiaran','Medak'),
													  (1246,'Satish','SangaReddy'))AS Temp2(EmpId,EmpName,Location);

DECLARE @query NVARCHAR(MAX);
SET @query=N'select '+(select Col_Names FROM #Temp1 WHERE ID=21)+' from #Temp2';

EXEC Sp_EXECUTESQL @query;


Member 13308004

Здравствуйте, я взял ниже ошибку, когда мне нужен столбец #Temp2. Не могли бы вы мне помочь, пожалуйста?
Многосоставный идентификатор "#Temp2.EmpId" не может быть привязан.

Выберите ID,Col_Names в #Temp1 из
(Значения(12,'EmpId'),
(1215,'EmpName'),
(23,'Location'))AS Temp1(ID,Col_Names);

Выберите EmpId,EmpName,Location в #Temp2 из
(Значения(1246,"Сантош Кумар","Хайд"),
(1215,"Хариш Кумар","Чаннай"),
(1234,"Сай Киаран","Медак"),
(1246,'Satish','SangaReddy'))AS Temp2(EmpId,EmpName,Location);

DECLARE @query NVARCHAR(MAX);
SET @query=N'Select '+(select Col_Names FROM #Temp1 WHERE ID IN (#Temp2.EmpId))+' from #Temp2';

print @query

Exec для процедуры sp_executesql @запросом;

падение таблицы #Temp1
drop table #Temp2

Santosh kumar Pithani

Могу ли я узнать, что это такое '#Temp2.EmpId)';чего вы от меня ждете?

Member 13308004

Привет,
Мне нужно использовать значение EmpId в таблице #Temp2 на месте определенных динамических имен столбцов.
Когда я пишу столбец таблицы #Temp2 в этой динамической области, он выдает ошибку.
"Многосоставный идентификатор "#Temp2.EmpId" не может быть привязан."
Как я понимаю, это относится к тексту not understand #Temp2.EmpId.

Спасибо,

Santosh kumar Pithani

если вы получаете имя столбца из другой таблицы(#temp1), то дайте его идентификатор в условии фильтра типа 'SET @query=N'Select '+(select Col_Names FROM #Temp1 WHERE ID=12)+' from #Temp2' '.здесь ID(12) принадлежит столбцу(EmpId).

Если вы хотите дать прямой то используйте
Объявить @column_name varchar(500)='EmpId'
SET @query=N'Select '+@column_name+' from #Temp2;'

Member 13308004

Выберите ID,Col_Names в #Temp1 из
(Значения(12,'EmpId'),
(999,'EmpName'),
(15,'Location'))AS Temp1(ID,Col_Names);

Выберите EmpId,EmpName,Location в #Temp2 из
(Значения(123,'Ali Veli','www'),
(999,"Угур","ррр"),
(124,'Aydin','bbb'),
(126,'Эркан','ээээ'))как Temp2(empid в,столбец empname,расположение);

DECLARE @query NVARCHAR(MAX);
SET @query=N'Select '+(select Col_Names FROM #Temp1 WHERE ID = '999' )+' from #Temp2 Where EmpId="999"';

print @query

Exec для процедуры sp_executesql @запросом;

падение таблицы #Temp1
drop table #Temp2

Но мне нужно как ниже:
Выберите ID,Col_Names в #Temp1 из
(Значения(12,'EmpId'),
(999,'EmpName'),
(15,'Location'))AS Temp1(ID,Col_Names);

Выберите EmpId,EmpName,Location в #Temp2 из
(Значения(123,'Ali Veli','www'),
(999,"Угур","ррр"),
(124,'Aydin','bbb'),
(126,'Эркан','ээээ'))как Temp2(empid в,столбец empname,расположение);

DECLARE @query NVARCHAR(MAX);
SET @query=N'Select '+(select Col_Names FROM #Temp1 WHERE ID = #Temp2.EmpId )+' from #Temp2 Where EmpId="999"';

print @query

Exec для процедуры sp_executesql @запросом;

падение таблицы #Temp1
drop table #Temp2

Это дает ошибку:
Msg 4104, Уровень 16, Состояние 1, Строка 14
Многосоставный идентификатор "#Temp2.EmpId" не может быть привязан.

Мне нужно использовать столбец #Temp2 в скобках.

Santosh kumar Pithani

Вы должны пройти, как показано ниже, но если оба значения одинаковы, то зачем вы пишете длинный код?

SET @query=N'Select '+(select Col_Names FROM #Temp1 WHERE ID IN (select EMPID from #Temp2 Where EMPID='999' )+' from #Temp2';

Member 13308004

Привет,
Большое спасибо за помощь. На самом деле, мне нужно сделать ниже ситуацию. Мне нужно поле.DATE_TIME, чтобы найти правильное имя столбца в скобках. Потому что есть столбцы для каждого дня, и мне нужно вычислить день из SHIFT_TABLE. Имена столбцов начинаются с "TPR" плюс день, например TPR13.

Объявить @SQLText NVARCHAR(MAX) = "
SELECT @SQLText += 'SELECT '
Выберите @SQLText += ( 'ТПР' + конвертировать(тип varchar,функция datepart(день.ДАТА_ВРЕМЯ) )
) +
от SHIFT_TABLE как где.идентификатор = "1" и.Ай="12" и.йил="2018" '

print @SQLText

Как я могу ее решить? большое спасибо,

Santosh kumar Pithani

Что это значит: "мне нужно поле.DATE_TIME, чтобы найти правильное имя столбца в скобках "?
вам нужно сгенерировать столбцы, например TRP13,TRP14.TRP15.. эти столбцы существовали в таблице SHIFT_TABLE? сначала отметьте это решение как правильное

Member 13308004

Объявить @SQLText NVARCHAR(MAX) = "
SELECT @SQLText += 'SELECT (SELECT '
Выберите @SQLText += ( 'ТПР' + конвертировать(тип varchar,функция datepart(день.ДАТА_ВРЕМЯ) )
) +
от SHIFT_TABLE как S, где S.ИД = а.ID ) из MAIN_TABLE как где.идентификатор="1" и.Ай="12" и.йил="2018" '

print @SQLText

Я беру сообщение об ошибке: многосоставный идентификатор "a.DATE_TIME" не может быть привязан.

SHIFT_TABLE происходит id и TPR01,TPR02,...Колонны ТПР31
MAIN_TABLE возникает, удостоверение личности, Ай, йил и ДАТА_ВРЕМЯ столбцы

Я должен вычислить день из a.DATE_TIME.

Как результат мне нужен такой, Select (выбрать TPR13 от SHIFT_TABLE как S, где S.ИД = а.ID ) из MAIN_TABLE как где.идентификатор='1' и.Ай='12' и.йил='2018'

Santosh kumar Pithani

используйте внутреннее соединение вместо подзапроса
SET @query=N'Select '+(select Col_Names FROM #Temp1 WHERE ID IN (select EMPID from #Temp2 Where EMPID='999' )+' from #Temp2';

Рейтинг:
0

OriginalGriff

Единственный способ сделать это-использовать build your command into a string и использовать EXEC для запуска результата: синтаксический анализ имен таблиц и столбцов выполняется на ранней стадии процесса выполнения SQL-команды и заменяется до выполнения любого фактического запроса.

EXECUTE (Transact-SQL) | Microsoft Docs[^]