Проблемы с выводом 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
так что мы можем помочь вам более точно