Удалить неиспользуемые (сгенерированные) столбцы

Я пытаюсь разделить значения имен для их анализа впоследствии. Для этого я генерирую 15 столбцов в T-SQL, а затем использую UDF ( https://social.technet.microsoft.com/wiki/contents/articles/26937.t-sql-splitting-a-string-into- multiple-columnss.aspx ), чтобы разделить столбец «значение» на новые столбцы (используя пробел как разделитель). Я получаю следующие результаты, как и предполагалось, до сих пор такие хорошие …

id|value |col_1|col_2|col_3|col_4|col_5|col_6|col_7|col_8|col_9|col_10|col_11|col_12|col_13|col_14|col_15 1 |xxx |x |x |x | | | | | | | | | | | | 2 |x |x | | | | | | | | | | | | | | 3 |xxxxxxx|x |x |x |x |x |x |x | | | | | | | | 4 |xxxx |x |x |x |x | | | | | | | | | | | 

Довольный своим решением, я начал с кода, чтобы действительно проанализировать отдельные части. Однако мой коллега придумал небольшую нонсенс, он сказал, что колонки, которые не используются, должны быть удалены. И потому, что меня назначают, чтобы помогать коллегам, а не рассказывать им, как глупо их вопросы, я сказал, что посмотрю на это.

Дело в том, что мое эго не позволяет мне использовать 15 жестко закодированных линий для этого. Мне бы очень хотелось сделать это с помощью курсора, так что код будет работать, если позже мне нужно будет разбирать гораздо более длинные строки (что, кстати, фактически предполагается). Я использую число в курсоре для создания имени столбца. Тогда я подумал, что было бы неплохо использовать «select 1 from # 1 where len (column_name)» – запрос, чтобы увидеть, используется ли столбец. Но теперь я застрял в создании динамического sql, который включает созданное имя_столбца. Это проблема, потому что мне нужно это же имя_столбца, чтобы удалить ее, если ее не найти.

 while @count < @max_nr_columns begin set @colname = 'part' + convert(varchar(255), (@count + 1)) declare @max_col_real nvarchar(4000)-- = N'max_col_real_is_empty' declare @mc int = 0 exec('sp_executesql (select 1 from #1 where ' + @colname + ' is not null), N''@max_col_real nvarchar(4000) output'', @max_col_real output') set @max_col_real = (@sql) set @count = @count + 1 end print @max_col_real 

Он выдает ошибку о запятой, что означает, что проблема находится в строке exec. Может ли кто-нибудь указать мне в правильном направлении для удаления столбца 8-15? Или скажите мне, что я делаю неправильно в приведенном выше коде?

Я использую SQL2014, но предпочитаю оставаться совместимым до 2008 года.

Вы можете поворачивать для подавления нулевых значений. Pivot, Stuff и FOR XML должны быть доступны с 2008 года.

Таким образом, пример может быть

SQL Code UPDATE с ДИНАМИЧЕСКИМ UNPIVOT

  Create table #temp (id int, value nvarchar(50),col_1 nvarchar(50),col_2 nvarchar(50),col_3 nvarchar(50),col_4 nvarchar(50),col_5 nvarchar(50),col_6 nvarchar(50),col_7 nvarchar(50),col_8 nvarchar(50),col_9 nvarchar(50)) insert into #temp values (1 ,'xxx' ,'x','x','x',null,null,null,null,null,null), (2 ,'x' ,'x',null,null,null,null,null,null,null,null), (3 ,'xxxxxxx','x','x','x','x','x','x','x',null,null), (4 ,'xxxx' ,'x','x','x','x',null,null,null,null,null) declare @gruppe nvarchar(max) declare @gruppeSql nvarchar(max) declare @SQL nvarchar(max) DECLARE myCustomers CURSOR FOR Select [Name] from tempdb.sys.columns where object_id = object_id('tempdb..#temp') and [name] like 'col%' set @gruppeSql = '' OPEN myCustomers FETCH NEXT FROM myCustomers INTO @gruppe IF (@@FETCH_STATUS>=0) BEGIN SET @gruppeSql = @gruppeSql +'[' [email protected]+']' FETCH NEXT FROM myCustomers INTO @gruppe END WHILE (@@FETCH_STATUS<>-1) BEGIN IF (@@FETCH_STATUS<>-2) SET @gruppeSql = @gruppeSql + ',[' [email protected]+']' FETCH NEXT FROM myCustomers INTO @gruppe END CLOSE myCustomers DEALLOCATE myCustomers SET @gruppeSql = replace(@gruppesql,'''','') print @gruppeSql --select @gruppeSql SET @SQL = ' SELECT distinct Pets = ''Select'' + STUFF((SELECT N'', '' + cols FROM (select distinct cols from #temp a UNPIVOT (Rowno for Cols in('[email protected]+')) as pvy ) AS p2 FOR XML PATH(N'''')), 1, 2, N'' '')' print @sql exec(@sql) drop table #temp 
  • Неверный синтаксис рядом с '+' с помощью курсора
  • SQL Call Сохраненная процедура для каждой строки без использования курсора
  • Продолжайте получать «курсор - это ЧИТАТЬ ТОЛЬКО»
  • Можно ли получить значение из предыдущей строки с помощью CURSORs SQL?
  • Получение значений из таблицы без использования КУРСОРОВ
  • Курс Oracle Cursor и SQL Server
  • Как создать хранимую процедуру, которая вызывает sp_refreshview для каждого представления в базе данных?
  • Ошибка конверсии в курсоре в хранимой процедуре
  • Нужны последние записи дня, из нескольких дней
  • Плюсы и минусы использования курсора (на SQL-сервере)
  • SQL Server: при запросе на столбец XML я могу вернуть столбец XML?
  • Interesting Posts

    .net с внешней dll

    SQL запускает переменную +1 до тех пор, пока переменная не достигнет 52?

    Что лучше – добавьте необязательный параметр в существующий SP или добавьте новый SP?

    Предотвращение кеширования на сайте ASP MVC, работающем на IIS 7.5

    Максимальная длина кодированной соли / пароля base64 для этого алгоритма

    Уникальный индекс, за исключением одной строки

    Преобразование результата запроса / хранимой процедуры в XML

    Как уменьшить размер базы данных SQL Server?

    Как вы проводите различие между серверами и входами Windows?

    SQL Server utf8 howto?

    фильтрация внутри COUNT в сервере sql

    Почему ADO BeginTrans () выполняет нечто иное, чем «НАЧАТЬ ПЕРЕДАЧУ»?

    (Выберите FirstName + '' + LastName из членов дает ошибку Невозможно выполнить неявное преобразование значения varchar в varchar

    SQL: создание новой таблицы с результатами запроса

    Работает ли новая среда идентификации ASP.NET MVC без Entity Framework и SQL Server?

    Давайте будем гением компьютера.