【问题标题】:Problems with bcp outputbcp 输出问题
【发布时间】:2017-07-13 06:36:32
【问题描述】:

我对以下代码有一些问题。这段代码的主要原因是将 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;

错误信息是:

你看到我的错误了吗?

【问题讨论】:

  • 您需要使用queryout 而不是out,因为您尝试从查询中获取数据,而不是从视图或表中获取数据。那是一回事。我仍然不确定-o

标签: sql-server tsql bcp


【解决方案1】:

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

将整个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+']');

使用bcp中的数据库参数(-d)选项

-d databasename

【讨论】:

  • 现在的结果是:(无列名)主输出 NULL 打印命令:PRINT 'Show: ' + @SQLEXE ;什么都不显示。
【解决方案2】:

在尝试执行之前,你应该打印你得到的命令: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 的输出,以便我们更准确地帮助您

【讨论】:

  • 现在的结果是:(无列名)主输出 NULL 打印命令:PRINT 'Show: ' + @SQLEXE ;什么都不显示。
  • >>>现在的结果是:(没有列名)master
  • >>>PRINT 'Show: ' + @SQLEXE ; 没有显示任何内容@SQLEXE 为空,您应该更正它
  • 在你设置你的@SearchSchema:SET @SearchSchema = REPLACE((SELECT name FROM sys.tables where name LIKE '%$Change Log Setup'), 'Change Log Setup', 'Change Log Entry');之后选择这个:SELECT @SearchSchema,我认为它是NULL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 2013-03-24
  • 2014-11-04
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多