bcp 输出的问题
Problems with bcp output
我在使用以下代码时遇到了一些问题。此代码的主要原因是将 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\Documentsa_EY_change_log_entry.txt" -o "C:\Users\Public\Documentsb_EYlog_change_log_entry.log" -c -T';
Exec master..xp_cmdshell @SQLEXE;
错误信息是:
你看到我的错误了吗?
在尝试执行之前,您应该打印您得到的命令:print @SQLEXE;
您至少有 1 个逻辑错误:当您执行 EXECUTE ('USE [' + @DBName+']');
时,它会更改数据库上下文 仅在您的动态代码 、
的持续时间内
所以如果你试试这个:EXECUTE ('USE [' + @DBName+']'); select db_name()
你会看到你仍然在你的数据库中,而不是在 @DBName
上下文中
然后你的 @SearchSchema
可能仍然是 NULL
这意味着 @SQLEXE
也变成空的。
但是,如果您的输出是基本的 bcp 使用语法,则可能您的命令不是空的,而是包含只有您可以看到的任何其他错误 print @SQLEXE;
。
例如,您可能是在用户默认数据库(可能是 master
)的上下文中执行代码,因为您没有将数据库名称放入代码中:select..from [dbo].[' + @SearchSchema + ']
但是如果您不指定数据库,它将是用户的默认数据库。
所以post这里是PRINT
的输出所以我们可以更准确地帮助你
这可能很奇怪,但它会起作用..
将整个 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\Documentsa_EY_change_log_entry.txt" -o "C:\Users\Public\Documentsb_EYlog_change_log_entry.log" -d '+quotename(@dname)+' -c -T';
此外,这不会像您期望的那样工作
EXECUTE ('USE [' + @DBName+']');
使用 bcp
中的数据库参数 (-d
) 选项
-d databasename
我在使用以下代码时遇到了一些问题。此代码的主要原因是将 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\Documentsa_EY_change_log_entry.txt" -o "C:\Users\Public\Documentsb_EYlog_change_log_entry.log" -c -T';
Exec master..xp_cmdshell @SQLEXE;
错误信息是:
你看到我的错误了吗?
在尝试执行之前,您应该打印您得到的命令:print @SQLEXE;
您至少有 1 个逻辑错误:当您执行 EXECUTE ('USE [' + @DBName+']');
时,它会更改数据库上下文 仅在您的动态代码 、
所以如果你试试这个:EXECUTE ('USE [' + @DBName+']'); select db_name()
你会看到你仍然在你的数据库中,而不是在 @DBName
上下文中
然后你的 @SearchSchema
可能仍然是 NULL
这意味着 @SQLEXE
也变成空的。
但是,如果您的输出是基本的 bcp 使用语法,则可能您的命令不是空的,而是包含只有您可以看到的任何其他错误 print @SQLEXE;
。
例如,您可能是在用户默认数据库(可能是 master
)的上下文中执行代码,因为您没有将数据库名称放入代码中:select..from [dbo].[' + @SearchSchema + ']
但是如果您不指定数据库,它将是用户的默认数据库。
所以post这里是PRINT
的输出所以我们可以更准确地帮助你
这可能很奇怪,但它会起作用..
将整个 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\Documentsa_EY_change_log_entry.txt" -o "C:\Users\Public\Documentsb_EYlog_change_log_entry.log" -d '+quotename(@dname)+' -c -T';
此外,这不会像您期望的那样工作
EXECUTE ('USE [' + @DBName+']');
使用 bcp
中的数据库参数 (-d
) 选项
-d databasename