Member 13739705 Ответов: 2

Sql не создает файл .xls с помощью cmdshell


У меня есть следующий код, который не помечает меня ошибкой, но во время его запуска я не создаю ни одного файла, ни одного решения?

declare @Fecha date, @FechaIni date, @FechaFin date
select @Fecha = getdate()
set @FechaIni = cast(convert(char(6), dateadd(MM, -1, @Fecha), 112) + '01' as date)
set @FechaFin = dateadd(DD, -1, cast(convert(char(6), @Fecha, 112) + '01' as date))


declare @sql Nvarchar(max)
set @sql = N'xp_cmdshell ''BCP "select count(distinct(till_no)) as cajas from poshist..dbo_register_header 
where proc_date between '''''+ CONVERT(NVARCHAR(30), @FechaIni)+ ''''' and '''''+ CONVERT(NVARCHAR(30), @FechaFin) + ''''' 
and till_no not in (61,62)" QUERYOUT  "C:file.xls"  -T -c'' '


exec(@sql)


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

Это и есть выход

использование: ПП {таблицу dbtable | запрос} {внутри | вне формата | для выражений|} данных
[-m maxerrors] [-f formatfile] [-e errfile]
[-F firstrow] [-L lastrow] [-b batchsize]
[-Н тип Native] [-C тип персонажа] [-W широкий тип характера ]
[-N keep non-text native] [-V версия формата файла] [-q цитируемый идентификатор]
Спецификатор кодовой страницы [-C] [-t полевой Терминатор] [-r строка Терминатор]
[-я входной_файл] [-о выходной_файл] [-а packetsize]
[-S имя сервера] [-U имя пользователя] [-P пароль]
[-Т доверенное соединение] [-версия] [-Р региональный включить]
[-k сохранить нулевые значения] [-Е сохранение значений идентификаторов ]
[-ч "нагрузка подсказки"] [-х генерировать в формате XML-файла ]
[-d имя базы данных]
НУЛЕВОЙ

#realJSOP

То, что вы называете "outuput", - это список возможных параметров командной строки для утилиты BCP. Я уже предлагал вам вместо этого создать импортный пакет ssis, но вы игнорируете этот совет.

2 Ответов

Рейтинг:
1

Santosh kumar Pithani

DECLARE @Fecha date, @FechaIni date, @FechaFin date;
SELECT @Fecha = GETDATE();
SET @FechaIni = CAST(CONVERT(CHAR(6), DATEADD(MM, -1, @Fecha), 112) + '01' AS DATE);
SET @FechaFin = DATEADD(DD, -1, CAST(CONVERT(CHAR(6), @Fecha, 112) + '01' AS DATE));


DECLARE @sql NVARCHAR(4000);
set @sql = N'BCP "select count(distinct(till_no)) as cajas from 
                  poshist..dbo_register_header 
                  where proc_date between '''+ CONVERT(NVARCHAR(30), @FechaIni)+ ''' 
                  and '''+ CONVERT(NVARCHAR(30), @FechaFin) + ''' and till_no not in 
                 (61,62)" QUERYOUT  "C:file.xls"   -S '+ @@SERVERNAME +' -T -c';           
EXEC master..xp_cmdshell @SQL;


Рейтинг:
0

Wendelius

Мало что можно попробовать или проверить


  • Вместо немедленного выполнения команды попробуйте ее распечатать. Замените его
    exec(@sql) с print @sql таким образом, вы можете видеть, что такое выход
  • Скопируйте выходные данные и попробуйте запустить сгенерированную команду вручную в командной строке, чтобы увидеть, как она действительно работает на уровне операционной системы
  • Не уверен но похоже у вас есть дополнительные апострофы вокруг дат
  • Убедитесь, что вы включили xp_cmdshell. Видеть параметр конфигурации сервера xp_cmdshell | Microsoft Docs[^]
  • Что касается имени файла, то вам, похоже, не хватает обратной косой черты после диска. Так что вместо этого c:file.xls вы должны иметь c:\file.xls
  • Также убедитесь, что процесс SQL Server имеет права на запись в каталог, который вы используете. В зависимости от уровня операционной системы вам может быть запрещено создавать файлы в папке назначения
  • Попробуйте перенаправить выходные данные в файл, чтобы исследовать, что происходит во время выполнения. Вы можете использовать -o или перенаправление командной строки с помощью > и 2>