Wendelius
Из-за гибкой природы языка SQL было бы трудно анализировать имена столбцов только из строки. Вам нужно будет принять во внимание такие вещи, как
- Псевдоним таблицы
- Псевдоним столбца
- Использование функций
- Скалярные запросы
- и так далее...
Несколько вещей, которые могут сработать для вас:
Сохраните список столбцов или имена столбцов в отдельной строке и используйте их в обоих местах.
определите имя столбца с помощью некоторого специального шаблона символов. Используйте этот шаблон для поиска столбцов, например
SELECT A.##BRN_NAME##,
A.##PROD_SERV##,
A.##COMP_TYPE##,
P.##PROD_SERV_TAT##,
COUNT(*) AS ##OVER_CNT##
FROM TRIAL
Теперь вы можете найти имена между ними
##
Просто не забудьте удалить хэши перед использованием оператора.
ДОПОЛНЕНИЕ:
---------
При извлечении имен столбцов и использовании их в других местах, в зависимости от ожидаемых инструкций SQL, необходимо учитывать множество факторов. Как уже было сказано, SQL является гибким в письменной форме.
Но для начала рассмотрим следующий пример
CREATE TABLE #test2 (
col1 int,
col2 int
);
INSERT INTO #test2 VALUES
(1,2),
(3,4);
Теперь, если мы создадим функцию, которая будет извлекать список столбцов из простого случая, это может выглядеть примерно так
CREATE FUNCTION ColList(@originalSql nvarchar(max)) RETURNS varchar(max) AS
BEGIN
DECLARE @list nvarchar(max),
@index1 int,
@index2 int;
SET @index1 = 0;
SET @list = '';
SET @index1 =CHARINDEX('##', @originalSql, 0) + 2;
WHILE @index1 > 0 BEGIN
SET @index2 =CHARINDEX('##', @originalSql, @index1 + 2);
IF (@list != '') BEGIN
SET @list = @list + ', ';
END;
SET @list = @list + SUBSTRING(@originalSql, @index1, @index2 - @index1);
SET @index1 = CHARINDEX('##', @originalSql, @index2 + 2) ;
IF (@index1 > 0 ) BEGIN
SET @index1 = @index1 + 2
END;
END;
RETURN @list
END;
Давайте проведем тест
DECLARE
@sql nvarchar(max),
@col nvarchar(max)
BEGIN
SET @sql = 'SELECT t.##Col1##, t.##Col2## FROM #Test2 t';
SET @col = dbo.ColList(@sql);
SET @sql = 'SELECT ' + @col + ' FROM (' + REPLACE(@sql, '##','') + ') a';
PRINT @sql;
EXEC (@sql);
END;
Выполняемый запрос выглядит следующим образом
SELECT Col1, Col2 FROM (SELECT t.Col1, t.Col2 FROM #Test2 t) a
Но, как уже было сказано, это только начало. Например, вам может потребоваться определить псевдоним для столбцов, используемых в списке столбцов, и т. д...