sqlcmd — Как обойти ограничение длины столбца без пустых пробелов?

#sql #sql-server #sqlcmd #batch-file

#sql #sql-сервер #sqlcmd #пакетный файл

Вопрос:

Я пытаюсь использовать sqlcmd на компьютере с Windows под управлением SQL Server 2005 для записи запроса в файл csv. Параметры командной строки, которые мы обычно используем, следующие:

 -l 60 -t 300 -r 1 -b -W -h -1
  

Однако столбцы усекаются на 256 байт. В попытке обойти это, я попытался использовать этот параметр командной строки вместо -W:

 -y 8000
  

Это захватывает все поля, но проблема с этим методом заключается в том, что файл увеличивается с чуть более 1 мб до примерно 200 мб из-за всего дополнительного пространства (я понимаю, что 8000, вероятно, излишне, но, вероятно, должно быть не менее 4000, и в настоящее время я работаю только с небольшим подмножеством данных). Опция -W обычно устраняет все это дополнительное пространство, но когда я пытаюсь использовать их вместе, она сообщает мне, что они взаимоисключающие.

Есть ли способ обойти sqlcmd это ограничение, или кто-нибудь знает, может ли другая программа (например, bcp или osql) упростить это?


Редактировать: Вот фрагменты кода, которые мы используем для получения усекаемого поля (аналогичный код используется для множества полей):

 SELECT ALIASES.AliasList as complianceAliases,    
  

 LEFT OUTER JOIN (Select M1.ID, M1.LIST_ID,stuff((SELECT '{|}'   isnull(Content2,'') ' ' isnull(Content3,'') ' ' isnull(Content4,'') ' ' isnull(Content5,'') ' ' isnull(Content6,'') ' ' isnull(Content7,'')
                                  FROM fs_HOST3_TEST_web.ISI_APP_COMP_MULTI M2 with (nolock)
                                  WHERE M1.LIST_ID = M2.LIST_ID and M1.ID = M2.ID and M1.TYPE = M2.TYPE                                      
                                  FOR XML PATH('')
                                  ),1,1,'') as AliasList
             FROM fs_HOST3_TEST_web.ISI_APP_COMP_MULTI M1 with (nolock)
             WHERE M1.LIST_ID = 2001 AND M1.TYPE = 'Aliases'
             GROUP BY m1.list_id,m1.ID,m1.Type) as ALIASES
             ON ALIASES.LIST_ID = PAIR.COMP_LIST_ID AND ALIASES.ID = PAIR.COMP_ID
  

Комментарии:

1. Какой тип данных относится к усеченным данным, пожалуйста?

2. Мы объединяем несколько полей nvarchar (500) в одно поле, используя комбинацию функции stuff и команды FOR XML PATH. Я не совсем уверен, как именно они работают (мы нашли решение через Google), но в итоге все они находятся в одном поле, и мы извлекаем их с помощью инструкции select. Я отредактирую ответ и включу код.

Ответ №1:

В итоге я решил эту проблему, используя аргумент «-y0». Он по-прежнему оставлял кучу пробелов, но, похоже, он доходил только до конца самого длинного фрагмента данных в каждом поле.

Затем я запустил вывод с помощью программы, которая удалила повторяющиеся пробелы и решила все проблемы.

Комментарии:

1. Использование -y0 действительно лучший вариант, спасибо! Просто обратите внимание, что это несовместимо с -h , хотя, похоже, это также удаляет заголовки из SQMCMD выходных данных.