Проблемы с выводом bcp

У меня есть некоторые проблемы со следующим кодом. Основной причиной этого кода является экспорт оператора SQL в файл. Но это не работает, и я не вижу своей ошибки.

DECLARE @DBName VARCHAR(5000);
DECLARE @period VARCHAR(5000);
DECLARE @SQLEXE VARCHAR(5000);
DECLARE @SearchSchema VARCHAR(5000);

SET @period = '''2017-01-01 00:00:00'' AND ''2017-12-31 23:59:59'''


SET @DBName = (SELECT name FROM master.dbo.sysdatabases where name LIKE '%NAV%');
EXECUTE ('USE [' + @DBName+']');

SET @SearchSchema  =  REPLACE((SELECT name FROM sys.tables where name LIKE '%$Change Log Setup'), 'Change Log Setup', 'Change Log Entry');
SET @SQLEXE = 'bcp "SELECT [Entry No_]
      ,[Date and Time]
      ,[User ID]
      ,[Table No_]
      ,[Field No_]
      ,[Type of Change]
      ,[Old Value]
      ,[New Value]
      ,[Primary Key]
      ,[Primary Key Field 1 No_]
      ,[Primary Key Field 1 Value]
      ,[Primary Key Field 2 Value]
      ,[Primary Key Field 3 No_]
      ,[Primary Key Field 3 Value]
      ,[Record ID]
  FROM [dbo].[' + @SearchSchema + ']
  WHERE [Date and Time] BETWEEN '+@period+'" out "C:\Users\Public\Documents\1a_EY_change_log_entry.txt" -o "C:\Users\Public\Documents\1b_EYlog_change_log_entry.log" -c -T';
Exec master..xp_cmdshell @SQLEXE;

Сообщение об ошибке:

Вы видите мою ошибку?

2 ответа

Решение

Это может быть странно, но это будет работать..

Поместите весь SQL в одну строку вместо новых строк

SET @SQLEXE = 'bcp "SELECT [Entry No_],[Date and Time],[User ID],[Table No_],[Field No_],[Type of Change],[Old Value],[New Value],[Primary Key],[Primary Key Field 1 No_],[Primary Key Field 1 Value],[Primary Key Field 2 Value],[Primary Key Field 3 No_],[Primary Key Field 3 Value],[Record ID] FROM [dbo].[' + @SearchSchema + '] WHERE [Date and Time] BETWEEN '+@period+'" out "C:\Users\Public\Documents\1a_EY_change_log_entry.txt" -o "C:\Users\Public\Documents\1b_EYlog_change_log_entry.log" -d '+quotename(@dname)+' -c -T';

Также это не будет работать, как вы ожидаете

EXECUTE ('USE [' + @DBName+']');

Используйте параметр базы данных (-d) вариант присутствует в bcp

-d databasename

Прежде чем пытаться выполнить, вы должны напечатать полученную команду: print @SQLEXE;

У вас есть как минимум 1 логическая ошибка: при выполнении EXECUTE ('USE [' + @DBName+']'); он изменяет контекст БД только на время этого вашего динамического кода,

так что если вы попробуете это: EXECUTE ('USE [' + @DBName+']'); select db_name()вы увидите, что вы все еще в вашей БД, а не в @DBName контекст

Тогда ваш @SearchSchema вероятно остается NULL а это значит @SQLEXE также становится нулевым.

Но если ваш вывод является базовым синтаксисом использования bcp, возможно, ваша команда не пуста, но содержит любую другую ошибку, которую видят только вы. print @SQLEXE;,

Например, может быть, вы исполняете свой код в контексте пользовательской базы данных по умолчанию (это, вероятно, master) потому что вы не включили свое имя базы данных в свой код: select..from [dbo].[' + @SearchSchema + '] но если вы не уточните базу данных, это будет база данных пользователя по умолчанию.

Так что опубликуйте здесь вывод PRINT так что мы можем помочь вам более точно

Другие вопросы по тегам