bcp输出问题

时间:2017-07-13 06:36:33

标签: sql-server tsql 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;

错误消息是: enter image description here

你看到我的错误吗?

2 个答案:

答案 0 :(得分:0)

在尝试执行之前,您应该打印您获得的命令:print @SQLEXE;

您至少有1个逻辑错误:当您执行EXECUTE ('USE [' + @DBName+']');时,它只会在动态代码的持续时间内更改数据库上下文

所以如果您尝试这样做:EXECUTE ('USE [' + @DBName+']'); select db_name() 你会发现你还在你的数据库中,而不是@DBName上下文

然后您的@SearchSchema可能仍为NULL,这意味着@SQLEXE也会变为空。

但是如果您的输出是基本的bcp使用语法,那么您的命令可能不是null,而是包含任何其他错误,只有您可以看到正在执行print @SQLEXE;

例如,可能是您在用户默认数据库(可能是master)的上下文中执行代码,因为您没有将dbname放在代码中:select..from [dbo].[' + @SearchSchema + ']但是如果您不准确数据库,它将是用户的默认数据库。

请在此处发布PRINT的输出,以便我们更精确地帮助您

答案 1 :(得分:0)

这可能很奇怪但它会起作用..

将整个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